javascript - 并行多次等待 promise

标签 javascript react-native

我在不同地方启动应用程序期间调用了一些服务器 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/

相关文章:

javascript - D3 TreeMap v3 到 v4

javascript - 导航关闭抽屉不工作 react 导航

React Native 上的 Firebase 客户端

javascript - 使用 select2 V4 中的数据类型属性值禁用选项

reactjs - React Native 中的 Jest 测试/模拟时刻

android - react-native-fcm android 通知不工作

react-native - 不变违规 : requireNativeComponent: "RNGADBannerView" was not found in the UIManager

javascript - 如何在 select2 数据行的一行中显示多个空白字符?

javascript - 如何在数据库和 Firebase 身份验证系统之间链接数据

javascript - 如何创建多选以显示 Django 中每个选定内容的详细信息?