Promise.all()接受一个由promise任务组成的数组,可以同时处理多个promise任务,当所有的任务都执行完成时,Promise.all()返回resolve,但当有一个失败(reject),则返回失败的信息,即使其他promise执行成功,也会返回失败。可以用一句话来说Promise.all(),要么全有要么全无。

但话又说回来,有时候我们使用Promise.all()执行很多个网络请求,可能有一个请求出错,但我们并不希望其他的网络请求也返回reject,要错都错,这样显然是不合理的。

而我们需要的是即使有一两个接口请求失败,我们依然可以获取到成功的接口请求数据。

要想理解Promise.all()的机制请看上一篇《理解promise》中的Promise.All示例

那下面说说如何做才能做到promise.all中即使一个promise程序reject,promise.all依然能把其他数据正确返回。

首先我们先创建一个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)
})
  • 执行结果如下

  • promise all resolve

然后在创建一个拥有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 with reject

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中我们可以监听到所有结果的返回,然后在针对不同的返回值进行处理。

Promise.all 处理error相关推荐

  1. UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throw

    今天vue项目本来跑的很正常突然莫名其妙就出现了错误(我根本没有改动代码??),慌得一批,又整了半小时终于复原了 依赖项真的莫名其妙的bug令人心力交瘁 删除了node_modules 尝试了的命令: ...

  2. Expected the Promise rejection reason to be an Error 的 解决方法

    问题描述:使用 eslint 出现 Expected the Promise rejection reason to be an Error 的问题. handleGeocoder (address) ...

  3. Uncaught (in promise) Error

    报Uncaught (in promise) Error错误解决办法 基本上是因为使用promise出现的,下面记录一下我的解决办法,有两种情况 使用axios请求接口时,在then()后加上catc ...

  4. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...

  5. Linux/ubuntu:Chrome报错解决: error while loading shared libraries: libnss3.so libXss.so.1 libasound.so.

    下午在用nodejs在linux上操作puppeteer/chromium/chrome时报错如下: -> # node search.js count is 1 (node:15360) Un ...

  6. ES6之路第十二篇:Promise对象

    Promise的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Prom ...

  7. 【es6】谈谈Promise

    学习vue写项目已经很久了,在项目中有许多地方会使用到Promise,无论前后端的接口通信,还是各种第三方的组件库或是插件,或多或少都会发现Promise的影子,所以今天简单梳理一下关于Promise ...

  8. Promise和Async-Await的入门教程

    1. Promise是什么 1.1 理解 抽象表达: Promise 是一门新的技术(ES6 规范) Promise 是 JS 中进行异步编程的新解决方案(旧方案是单纯使用回调函数) 具体表达: 从语 ...

  9. Promise用法总结

    1. Promise的状态 Promise对象有三个状态: 1. 进行中(pending) 2. 成功(resolved) 3. 失败(rejected) 2. 生成一个Promise对象 1. 构造 ...

最新文章

  1. 第九届全国大学生智能汽车竞赛获奖名单
  2. 节点部署_国际电联设定大星座部署节点要求
  3. php excel cpu高,phpexcel读文件的时候cpu99%
  4. 成功解决利用pandas输出DataFrame格式数据表时没有最左边的索引编号(我去,这个问题折腾了我半个多小时)
  5. 团队章程---促进团队更合作和更高效
  6. Linux学习记录-7
  7. 前端学习(3244):react的生命周期新
  8. python里面的list
  9. ExtTabMenu 控件
  10. mysql二进制日志特点_MySQL二进制日志分析-概述篇
  11. 请问asp.net网页里能显示tiff格式的图片吗?
  12. Eigen中 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF的使用方式_C/C++中的预编译简介
  13. u9系统的使用方法仓库_用友U9--INV库存管理手册.pdf
  14. 【论文阅读】Multitask Prompted Training Enables Zero-shot Task Generalization
  15. linux命令弹出移动硬盘,usb设备(移动硬盘或U盘),弹出时提示“有进程或程序占用,无法弹出”。解决办法...
  16. matlab多边形检测_matlab实现多边形顶点凹凸性的识别
  17. QQ2009SP5和SP6后台会疯狂的访问qqlogo.qq.com:80
  18. 马士兵python_马士兵:python学习(一)
  19. eeglab在MATLAB中安装教程
  20. 云电视和智能电视是什么,之间有什么区别?

热门文章

  1. Linux Shell高级技巧(三)
  2. How to install Aptana Studio 3.3.1 in Ubuntu 12.10 (Quantal Quetzal)
  3. 驱动中EXPORT_SYMBOL()的作用
  4. shell数值运算的方法
  5. 更换 CentOS 7 的下载源为阿里云
  6. 机器学习速成课程 | 练习 | Google Development——编程练习:神经网络简介
  7. Leetcode算法题(C语言)11--有效的数独
  8. Spring boot整合ElasticSearch
  9. 多存多取问题 java
  10. 窗体常用属性的演练 c#