需求場景大概就是:調用的方法是異步的。需要遍歷參數,循環調用這個方法。拿到所有方法執行的結果,才能進行下一步。
所以說,需要在循環里面執行異步方法,然后正確拿到所有結果。
剛面臨這個問題的時候我是拒絕的,對於我這個還沒出新手村的菜鳥來說,異步,還循環,離譜,總不能callback一層一層套進去吧。
然后我想到了遞歸,但是有風險,遞歸不好處理異常,掛一個倒一片。
最終選擇的處理方式是:promise和promise.all()。
promise 簡單示例:
var promise = new Promise(function(resolve, reject) {
// resolve()在方法執行完成時調用,告訴程序方法執行完了
// reject()在方法執行異常時調用,告訴程序方法掛了
...此處是一個異步方法
if(異步方法執行成功){
// 可以傳參
resolve(successData);
}else if(異步方法執行失敗){
// 可以傳參
reject(failedData);
}
});
promise.then(function(data){
// 進入這個方法,意味着promise里面的方法執行完成,
// promise的狀態變成fulfilled或者rejected
// data 就是resolve()或者reject傳過來的參數
console.log("異步方法執行完成...");
})
promise簡單粗陋地解釋,它就是一個對象,它的一生有三種狀態:pending(進行中),fulfilled(執行成功),rejected(執行失敗),並且三種狀態互斥。
promise從誕生伊始處於Pending狀態,調用resolve()方法可以使其變成fulfilled狀態,調用reject()方法可以使其變成rejected狀態。
fulfilled狀態和rejected狀態都能觸發then()方法。
再通俗點說就是,在promise對象里寫一段異步執行的代碼,當這段代碼執行完畢的時候,調用resolve()方法,調用resolve()方法,調用resolve()方法,那么就能觸發then()方法。
then()方法是可以鏈式寫下去的,但是需要在上一個then()方法里返回一個新的promise對象。
現在進入正題,怎么循環異步
核心方法就是:創造一個promise數組promiseArray,然后調用Promise.all(promiseArray).then(function(data){});
Promise.all會在整個promise數組里的promise執行完成以后,調用then()方法,並且返回所有promise的參數。
例子:
var promiseArray = [];
for(var i = 0;i<10;i++){
promiseArray.push(new Promise(function(resolve,reject){
console.log("創建了一個promise");
...//一段異步代碼
if(異步執行成功){
// 改變promise的狀態,告訴程序這個promsie執行完成並執行成功了
resolve(data);
}else if(異步執行失敗){
// 改變promise的狀態,告訴程序這個promsie執行失敗了
reject(data);
}
}));
}
Promise.all(promiseArray).then(data){
console.log("所有promise執行完成");
// 並且所有執行的結果都在data里面了,處理它們吧
}
promise 異步循環,能用,好用,感恩的心,感謝promise.
記得調resolve()方法哦。