实现 Promise.all,所有 Promise 成功返回成功,一个失败返回失败
发布日期:2024-02-09 19:29:46 浏览次数:42 分类:博客文章

本文共 1894 字,大约阅读时间需要 6 分钟。

首先我们先创建一个resolve和reject的promise函数

const promiseResove = (promiseResolveSecond = function(n=0){

return new Promise(function(resolve, reject){
setTimeout(function() {
resolve({
resolveAfterSeconds: n
})
}, n * 100);
})
})
const promiseReject = (promiseRejectSecond = function(n=0) {
return new Promise(function(resolve, reject) {
setTimeout(function () {
reject({
rejectAfterSeconds: n
})
}, n * 100)
})
})

使用上面的函数创建一个所有结果能正确返回的promise.all程序

var promiseArray = []

promiseArray.push(promiseResove(1))
promiseArray.push(promiseResove(3))
promiseArray.push(promiseResove(2))
var handlePromise = Promise.all(promiseArray)
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})

然后在创建一个拥有reject函数返回的promise

var promiseArray = []

promiseArray.push(promiseResove(1))
promiseArray.push(promiseReject(3))
promiseArray.push(promiseResove(2))
var handlePromise = Promise.all(promiseArray)
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})

 

promise.all中有一个promise执行失败返回reject时,promise.all直接返回执行失败的promise结果。

但我们还想看到其他两个resolve的结果,所以后面用一个trick方法,来解决这个问题。

 

var promiseArray = []

promiseArray.push(promiseResove(1))
promiseArray.push(promiseReject(3))
promiseArray.push(promiseResove(2))
// 将传入promise.all的数组进行遍历,如果catch住reject结果,
// 直接返回,这样就可以在最后结果中将所有结果都获取到
var handlePromise = Promise.all(promiseArray.map(function(promiseItem) {
return promiseItem.catch(function(err) {
return err
})
}))
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})

和之前唯一的不同就是在promise添加了一个回调函数,当数组中有接口reject时,catch住结果直接返回,这样失败的结果也可以当做成功处理,所以在promise.all中我们可以监听到所有结果的返回,然后在针对不同的返回值进行处理。

 

转载地址:https://www.cnblogs.com/judyhuayu/p/16730897.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:实现 Python 下的洛伦兹变换算法及完整源码
下一篇:实现 Promise.allPromise.all = function (arr) { // 实现代码}

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月01日 09时39分06秒