Promise在JS中可以说有着举足轻重的地位,很早之前就看了很多Promise的文章和书籍,记得在一篇文章中看到过Promise的list方法(作用下边有详细介绍)还做了笔记,但是,在使用的时候却发现现在的JS标准(ES6)不支持list方法,所以,就自己写一个吧!哈哈哈哈哈
Promise.list():
作用:将多个Promise对象包装成一个新的Promise对象,并行运行多个Promise对象,所有Promise对象结束触发then事件。主要功能:若有Promise对象出错(list方法的重点),则包装为
{ error: "error msg" } // 错误信息
正确则返回结果。
示例:
var p = Promise.list([p1,p2,p3]);
p.then(function(values) {
// values为[{p1的结果},{p2的结果},{p3的结果}]
})
接受参数: 一个数组,数组每一项为Promise对象,如p1、p2、p3。
返回结果: 一个数组,顺序排列每一项的结果。
实现:
// 原始版
if (!Promise.list) {
Promise.list = function (jobArr) {
let jobsResult = [];
jobArr.forEach(function (job) {
// 运行数组内的Promise对象,出现错误包装为{"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);
}
}
// 创建一个数组,每一项为Promise对象
var pArr = [1, 2, 3, 4].map(function (value) {
if (value == 3) { // 第三个设置为会出错的Promise对象
return createPromise(0);
} else {
return createPromise(1);
}
})
// 创建Promise对象的方法,returnStatus为1返回正确的Promise对象,其他则返回错误的Promise对象
function createPromise(returnStatus) {
return new Promise(function (reslove, reject) {
if (returnStatus == 1) {
reslove({data: "success"});
} else {
reject("failed");
}
});
}
// 调用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);
})
总结: 欢迎指教。哈哈哈哈哈
网友评论