Как настроить 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);
  }
}
Другие вопросы по тегам