如何使用基于承诺的环境设置 Relay Modern? (例如 Auth0 或其他异步身份验证服务?)
How to set up Relay Modern with a Promise-based Environment? (e.g. Auth0 or another async authentication service?)
在 Relay Classic 中,我们只是将一个函数传递给 react-relay-network-layer 以 return 承诺中所需的令牌。 Relay Modern 中的等价物是什么?
理想情况下,我希望在环境承诺解决之前显示加载屏幕,然后在我们拥有环境并获取查询后显示主要组件。
所以如果我知道如何换掉 QueryRenderer 的环境,那也可以解决问题。
recommended method here 是在 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);
}
}
在 Relay Classic 中,我们只是将一个函数传递给 react-relay-network-layer 以 return 承诺中所需的令牌。 Relay Modern 中的等价物是什么?
理想情况下,我希望在环境承诺解决之前显示加载屏幕,然后在我们拥有环境并获取查询后显示主要组件。
所以如果我知道如何换掉 QueryRenderer 的环境,那也可以解决问题。
recommended method here 是在 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);
}
}