要說的都在注釋里。需要讀者本身對這個方法略知一二。
//方法在原型上定義,all方法接受一組可迭代對象作為參數,通常是一組promise
Deferred.prototype.all = function(promises){
//獲取參數數組長度,即并發promise的個數。
var count = promises.length;
//保存當前this
var that = this;
//聲明結果數組,存放參數數組的執行結果
var results = [];
//forEach循環是并發執行,Promise.all()可以處理并發請求的根源。
promises.forEach(function(promise,i){
//resolve()
promise.then(function(data){
//當每一個promise被處理,count-1
count--;
//傳入resolve函數的參數data為與異步操作相關的附加數據。
results[i] = data;
//當參數數組中的所有promise都被處理時。promise.all()返回的promise被解決。
if(count == 0){
that.resolve(results);
}
//如果某一個失敗,promise.all()立即執行reject回調。
//但剩余的promise依舊繼續執行,只不過對promise.all的結果不會產生影響了。
},function(err){
that.reject(err);
});
}) ;
return this.promise;
}