首页 > 解决方案 > 并行多次等待一个承诺

问题描述

我有一些服务器 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()完成,两种方法都可以继续工作?

标签: javascriptreact-native

解决方案


我认为您的想法是正确的,但逻辑需要稍作调整:

    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根据需要多次做出相同的承诺。


推荐阅读