Promise在JS中可以說有著舉足輕重的地位驶社,很早之前就看了很多Promise的文章和書籍艰毒,記得在一篇文章中看到過Promise的list方法(作用下邊有詳細(xì)介紹)還做了筆記裁着,但是伦吠,在使用的時候卻發(fā)現(xiàn)現(xiàn)在的JS標(biāo)準(zhǔn)(ES6)不支持list方法赫段,所以舵抹,就自己寫一個吧背蟆!哈哈哈哈哈
Promise.list():
作用:將多個Promise對象包裝成一個新的Promise對象鉴分,并行運行多個Promise對象,所有Promise對象結(jié)束觸發(fā)then事件带膀。主要功能:若有Promise對象出錯(list方法的重點)志珍,則包裝為
{ error: "error msg" } // 錯誤信息
正確則返回結(jié)果。
示例:
var p = Promise.list([p1,p2,p3]);
p.then(function(values) {
// values為[{p1的結(jié)果},{p2的結(jié)果},{p3的結(jié)果}]
})
接受參數(shù): 一個數(shù)組垛叨,數(shù)組每一項為Promise對象伦糯,如p1、p2嗽元、p3敛纲。
返回結(jié)果: 一個數(shù)組,順序排列每一項的結(jié)果剂癌。
實現(xiàn):
// 原始版
if (!Promise.list) {
Promise.list = function (jobArr) {
let jobsResult = [];
jobArr.forEach(function (job) {
// 運行數(shù)組內(nèi)的Promise對象淤翔,出現(xiàn)錯誤包裝為{"error": reason}
jobsResult.push(job.then(function (value) {
return value;
}).catch(function (reason) {
return {"error": reason};
}));
})
// 用Promise.all包裝為一個新的Promise對象
return Promise.all(jobsResult);
}
}
// 精簡版
if (!Promise.list) {
Promise.list = list => Promise.all( list.map( item => item.then(val => ({val})).catch(err => ({err}))));
}
使用示例:
// 添加Promise.list方法
if (!Promise.list) {
Promise.list = function (jobArr) {
let jobsResult = [];
jobArr.forEach(function (job) {
jobsResult.push(job.then(function (value) {
return value;
}).catch(function (reason) {
return {"error": reason};
}));
})
return Promise.all(jobsResult);
}
}
// 創(chuàng)建一個數(shù)組,每一項為Promise對象
var pArr = [1, 2, 3, 4].map(function (value) {
if (value == 3) { // 第三個設(shè)置為會出錯的Promise對象
return createPromise(0);
} else {
return createPromise(1);
}
})
// 創(chuàng)建Promise對象的方法珍手,returnStatus為1返回正確的Promise對象办铡,其他則返回錯誤的Promise對象
function createPromise(returnStatus) {
return new Promise(function (reslove, reject) {
if (returnStatus == 1) {
reslove({data: "success"});
} else {
reject("failed");
}
});
}
// 調(diào)用Promise.list()方法
Promise.list(pArr).then(function (value) {
console.log("value:", value); // 第三個會返回錯誤信息:[ { data: 'success' },{ data: 'success' },{ error: 'failed' },{ data: 'success' } ]
}).catch(function (reason) {
console.log("error:", reason);
})
總結(jié): 歡迎指教。哈哈哈哈哈