Как настроить Relay Modern в среде, основанной на обещаниях? (например, Auth0 или другой сервис асинхронной аутентификации?)
В Relay Classic мы просто передали бы функцию response-relay-network-layer для возврата требуемого токена в обещании. Что эквивалентно в Реле Модерн?
В идеале я хотел бы отображать экран "Загрузка" до тех пор, пока не будет выполнено обещание "Окружение", а затем отобразить основной компонент, как только мы получим среду и запрос будет получен.
Так что, если бы я знал, как поменять среду QueryRenderer, это также решило бы проблему.
1 ответ
Рекомендованным способом здесь является получение токена аутентификации внутри fetchQuery.
Оставшаяся проблема заключается в том, чтобы убедиться, что функция асинхронной аутентификации вызывается только один раз, даже если ретрансляция извлекается несколько раз, пока аутентификация еще продолжается. Мы сделали это, используя однообещающее обещание; каждый вызов fetchQuery вызывает статический метод Promise.resolve() для одного и того же обещания, поэтому после завершения вызова аутентификации все вызовы fetchQuery продолжаются с требуемой информацией аутентификации.
Так fetchQuery
получает токен авторизации (JWT) с:
const authToken = await AuthToken.get();
А AuthToken выглядит так (TypeScript):
class AuthToken {
private static _accessTokenPromise: Promise<string>;
public static async get() {
if (!this._accessTokenPromise)
this._accessTokenPromise = this.AuthFunction(); // AuthFunction returns a promise
return await Promise.resolve(this._accessTokenPromise);
}
}