我在不同地方启动应用程序期间调用了一些服务器 API 方法,这些方法无法根据调用位置进行重构,比如说 getSettings()
和getSchedule()
。两种方法都基于 login(): Promise<Account>
方法、设置以及时间表都是基于用户的。
现在我已经解决了getSettings()
开头的问题和getSchedule()
像下面这样:
class UserFunctions {
private fetch_login: Promise<AccountItem> = undefined;
async getSchedule(): Promise<any> {
var account = getAccount();
if (!account) {
// No account loaded
let isLogginIn = this.fetch_login;
if (!this.fetch_login) {
// Not logging in from any parallel method
this.fetch_login = login();
}
account = await this.fetch_login;
this.fetch_login = undefined;
}
// Now get schedule...
}
}
背后的想法是 login()
无论调用多少次,函数都只被调用一次。这就是为什么我多次引用 Promise 来等待它。这有效,但我注意到有时当 login()
完成getSettings()
提早可以继续工作并且 getSchedule()
停留几秒钟直到继续执行。有时是相反的,有时两种方法会同时返回。
这里我打印了输出:
06-05 16:46:08.126 27376 27397 I ReactNativeJS: Logging in back
06-05 16:46:08.690 27376 27397 I ReactNativeJS: Logged in back
06-05 16:46:08.696 27376 27397 I ReactNativeJS: Schedule downloaded
06-05 16:46:09.274 27376 27397 I ReactNativeJS: Logged in back
你知道如何改进代码吗login()
完成后,这两种方法都可以继续工作吗?
最佳答案
我认为你的想法是正确的,但逻辑需要一些调整:
var account = getAccount();
if (!account) {
// No account loaded
if (!this.fetch_login) {
// Not logging in from any parallel method
this.fetch_login = login();
}
account = await this.fetch_login;
}
基本上,这个想法是您将 fetch_login
设置为在第一次调用时获取 Promise 的值。之后,您可以根据需要多次 await
相同的 Promise。
关于javascript - 并行多次等待 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56463230/