簡體   English   中英

JavaScript:foreach循環中的Promise鏈接

[英]JavaScript: Promise chaining in foreach loop

我是javascript Promise的新手,在將其與一系列元素結合使用時遇到困難。 在集合中,我執行一個返回承諾的操作。 整個操作(包括集合中的所有Promises)完成后,我需要執行另一組操作。 集合中的承諾需要按順序進行。

我嘗試了以下方法:

public cleanup(onCleanupComplete: any): void {
        if (this._app == null) return; //this._app comes out of an external API

       // Below line of code won't compile, it is just for illustration. 
       // I'm trying to show that I need a promise in return from method
        this.removeConference(0).then(() => {
              // Do additional clean up operation and call onCleanupComplete
                onCleanupComplete(true, null);                
        });

    }

    private removeConference(i : number) {
        if (this._app.conversationsManager.conversations == null 
           || i === this.conversationLength)
            return; // this.conversationLength equals initial 
                    // number of elements in collection 
                    // How do I return a promise here?

        var conversation = this._app.conversationsManager.conversations(0);
                console.log("app.cleanup.leave", `Leaving conversation ${conversation}`);
        conversation.leave().then(() => {
                console.log("app.cleanup.leave", `Conversation ${conversation} left successfully`);
            this.app.conversationsManager.conversations.remove(conversation);
 _           this.removeConference(i);
        });
    }

刪除集合中的所有conversations ,我應該從removeConference返回什么?

因此,在理解諾言的早期,這就是我的難處。 您需要將所有代碼都與傳遞回調的做法分開,然后簡單地使用promise進行調用。 相反,為了保持promise的連續性,您只想將promise 返回給調用函數,除非您的函數是應該決定后續操作的函數。 因此,您的代碼應如下所示。

public cleanup(onCleanupComplete: any):Promise<any> {
        if (this._app == null) return; //this._app comes out of an external API

       // Below line of code won't compile, it is just for illustration. 
       // I'm trying to show that I need a promise in return from method
       var promiseArray = [];
       for (var i = 0; i < this.conversationLength; i++) {
         promiseArray.push(removeConference(i));
       }
       return Promise.all(promiseArray);

    }

    private removeConference(i : number):Promise<any> {
        if (this._app.conversationsManager.conversations == null 
           || i === this.conversationLength)
            return Promise.resolve(true);

        var conversation = this._app.conversationsManager.conversations(0);
                console.log("app.cleanup.leave", `Leaving conversation ${conversation}`);
        return conversation.leave().then(() => {
                console.log("app.cleanup.leave", `Conversation ${conversation} left successfully`);
            this.app.conversationsManager.conversations.remove(conversation);
            this.removeConference(i);
        });
    }

我不是100%肯定會正確編譯,但是希望它在概念上有所幫助。 Promise.all實際上是這里的關鍵功能-它接受一組諾言,並創建一個匹配的“控制諾言”,只有當所有諾言都有時才進行解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM