![](/img/trans.png)
[英]Promise.all not waiting for promises to finish before moving to .then
[英]JavaScript Promises - Waiting for resolution before moving on
我需要執行以下操作:
我有以下代碼:
App.Lines = response.data;
for (var _i = 0; _i < App.Lines.length; _i++) {
var makeCallPromise = new Promise(
function(resolve, reject) {
Session.connection.ol.makeCall(App.Lines[_i], callBackFunction(response) {
//this can take up to 30 seconds to respond...
resolve(response.data);
}, errorCallBackFunction(message) {
reject(message.error);
}, bareJid);
}
)
makeCallPromise.then(function(fulfilled) {
console.log("PROMISE WORKED!!!!!", fulfilled);
})
.catch(function(error) {
console.log("PROMISE FAILED!!!!!", error);
});
}
我希望該循環在繼續執行該循環之前將等待解決諾言,但是事實並非如此。 我的問題是在解決方案完成之前是否可以暫停循環。 注意-我正在使用bluebird JS庫進行承諾。 謝謝!
親切的問候,
加里
我不了解bluebird,但是您可以執行類似的操作來創建某種for循環,以等待每個promise在下一次迭代之前結束。
這是一個通用示例,當然可以對其進行優化,這只是一個快速嘗試:
var i = 0;
var performAsyncOperation = function(operationNumber) {
return new Promise(function(resolve, reject){
console.log('Operation number', operationNumber);
resolve();
});
}
var chainAsyncOperations = function() {
if(++i < 10) {
return performAsyncOperation(i).then(chainAsyncOperations);
}
};
performAsyncOperation(i).then(chainAsyncOperations);
希望這對您有幫助;)
您可以使用bluebird提供的Promise.each() ,它將順序遍歷一個數組並等待它們解析,然后再移至數組中的下一個元素
該用例與ES7功能async await
完全匹配,如果您可以使用babeljs轉換代碼,則可以像下面這樣重構函數:
function createPromise(line) {
return new Promise(
function(resolve, reject) {
Session.connection.ol.makeCall(line, callBackFunction(response) {
//this can take up to 30 seconds to respond...
resolve(response.data);
}, errorCallBackFunction(message) {
reject(message.error);
}, bareJid);
}
);
}
App.Lines = response.data;
async function main() {
for (var _i = 0; _i < App.Lines.length; _i++) {
try {
var result = await createPromise(App.Lines[_i]);
console.log(result);
} catch (err) {
console.log(err);
}
}
}
main().then(function() {
console.log('finished');
});
您應該使用Bluebird#each
方法:
.each(函數(任何項目,int索引,int長度)迭代器)-> Promise
遍歷數組或數組的promise,該數組或promise包含帶有給定迭代器函數的promise(或promise和值的混合)以及簽名(值,索引,長度),其中value是輸入數組。 迭代是串行發生的。 如果輸入數組中的任何承諾被拒絕,則返回的承諾也將被拒絕。
Promise.each(App.Lines, line => {
return new Promise((resolve, reject) => {
Session.connection.ol.makeCall(line, callBackFunction(response) {
resolve(response.data);
}, errorCallBackFunction(message) {
reject(message.error);
}, bareJid);
})
.then(fulfilled => console.log("PROMISE WORKED!!!!!", fulfilled))
.catch(err => onsole.log("PROMISE FAILED!!!!!", err));
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.