Обещания асинхронные - обратный вызов, который вы передаете then
, оценивается после возврата вашей функции. Вы можете заставить всю функцию configureClient
возвращать Promise, но это будет означать, что вам придется изменить способ ее использования в другом месте вашего приложения (опять же, потому что в этот момент весь клиент будет инициализирован асинхронно).
function configureClient(): Promise<ApolloClient<ApolloCache<any>>> {
return getOktaToken().then(token => {
return new ApolloClient<InMemoryCache>({
uri: "someUrl",
cache: new InMemoryCache(),
headers: {
someAuth: token
}
});
});
}
// or the equivalent using async/await syntax
async function configureClient(): Promise<ApolloClient<ApolloCache<any>>> {
const token = await getOktaToken()
return new ApolloClient<InMemoryCache>({
uri: "someUrl",
cache: new InMemoryCache(),
headers: {
someAuth: token
}
});
}
Вы можете отложить рендеринг вашего приложения до получения клиента. Например:
const App = () => {
const [client, setClient] = useState(null)
useEffect(() => {
configureClient().then(setClient)
}, [])
if (!client) {
return null
}
return (
<ApolloProvider client={client}>
...
</ApolloProvider>
)
}
Если у вас есть заголовки, которые нужно извлекать асинхронно, однако, предпочтительный способ сделать это - использовать apollo-link-context
. Вы должны прекратить использование Apollo Boost или, что еще лучше, перейти на последнюю версию Apollo Client . Затем вы можете настроить ссылки для своего клиентского экземпляра и добавить контекстную ссылку, как показано здесь .