javascript - 并行多次等待一个承诺
问题描述
我有一些服务器 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:重新登录
06-05 16:46:08.690 27376 27397 I ReactNativeJS:重新登录
06-05 16:46:08.696 27376 27397 I ReactNativeJS:已下载时间表
06-05 16:46:09.274 27376 27397 I ReactNativeJS:重新登录
您是否知道如何改进代码,一旦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
在第一次调用时设置它的值。之后,您可以await
根据需要多次做出相同的承诺。
推荐阅读
- c++ - 使用 libmysql 插入特殊字符
- python - 用于语音到文本的python程序
- javascript - 使用 jQuery 更改变换原点?
- laravel - Laravel - 与 Eloquent 集合不同的合并集合?
- unity3d - 如何解决“注册远程通知失败”,在“Unity Cloud Build”构建的iOS游戏上接收推送通知
- python - 如何将多个请求作为微服务处理
- javascript - 如何在 Angular.js 中使用 multipledropdown.js 使复选框只读
- reactjs - 如何在 webpack 配置中解析 css 加载器?
- shell - grep 用于具有特殊字符的特定文本
- join - N1QL 查询以加入文档,在 couchbase 中具有最新的子项(基于 creationDateTime)