[英]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.