异步 ES2017 构造函数
Async ES2017 Constructor
确保某些异步代码在随后使用 class 之前在 class 构造函数中完成的最新方法是什么?
具体来说,API 客户端 class 如何在允许更多方法调用之前检索访问令牌,如下所示?
class API_Client {
constructor(...) {
# Below should 'block' other method calls until token is assigned
this.login().then(res => {
this.token = res.data.token;
});
}
async login() {
return makeRequest(...) # <-- Promise which returns access token data
}
}
const client = new API_Client(...);
client.someAuthOnlyMethod() # <-- Should only happen after the `login` method completes.
我找到了 older answers,但不太明白如何解决链接答案留下的第一条评论中提出的问题。
您一开始就不应该从构造函数调用任何异步代码。在上述情况下,您的 makeRequest 函数会担心登录令牌。
在这种情况下,class 也没有真正的价值。您应该只导出一系列函数来进行 API 调用。
最新的方法仍然是not to put any asynchronous stuff in the constructor。在你的具体情况下,那是
class API_Client {
constructor(token) {
this.token = token;
}
static async createLoggedIn(…) {
const res = await makeRequest(...) # <-- Promise which returns access token data
return new this(res.data.token);
}
}
const client = await API_Client.createLoggedIn(…);
client.someAuthOnlyMethod()
您可以将令牌存储为承诺:
class API_Client {
constructor(...) {
# Below should 'block' other method calls until token is assigned
this.token = this.login()
.then(res => res.data.token)
}
async someAuthOnlyMethod() {
let token = await this.token;
//...continue
}
async login() {
return makeRequest(...) # <-- Promise which returns access token data
}
}
const client = new API_Client(...);
client.someAuthOnlyMethod() # <-- Should only happen after the `login` method completes.
确保某些异步代码在随后使用 class 之前在 class 构造函数中完成的最新方法是什么?
具体来说,API 客户端 class 如何在允许更多方法调用之前检索访问令牌,如下所示?
class API_Client {
constructor(...) {
# Below should 'block' other method calls until token is assigned
this.login().then(res => {
this.token = res.data.token;
});
}
async login() {
return makeRequest(...) # <-- Promise which returns access token data
}
}
const client = new API_Client(...);
client.someAuthOnlyMethod() # <-- Should only happen after the `login` method completes.
我找到了 older answers,但不太明白如何解决链接答案留下的第一条评论中提出的问题。
您一开始就不应该从构造函数调用任何异步代码。在上述情况下,您的 makeRequest 函数会担心登录令牌。
在这种情况下,class 也没有真正的价值。您应该只导出一系列函数来进行 API 调用。
最新的方法仍然是not to put any asynchronous stuff in the constructor。在你的具体情况下,那是
class API_Client {
constructor(token) {
this.token = token;
}
static async createLoggedIn(…) {
const res = await makeRequest(...) # <-- Promise which returns access token data
return new this(res.data.token);
}
}
const client = await API_Client.createLoggedIn(…);
client.someAuthOnlyMethod()
您可以将令牌存储为承诺:
class API_Client {
constructor(...) {
# Below should 'block' other method calls until token is assigned
this.token = this.login()
.then(res => res.data.token)
}
async someAuthOnlyMethod() {
let token = await this.token;
//...continue
}
async login() {
return makeRequest(...) # <-- Promise which returns access token data
}
}
const client = new API_Client(...);
client.someAuthOnlyMethod() # <-- Should only happen after the `login` method completes.