Promise.all中对于reject的处理方法


Posted in Javascript onAugust 01, 2018

昨天写了个小爬虫,用axios.all同时请求多个页面时,国内网络的原因很容易就超时然后reject了,佛系resolve不可取啊,然后想到可以实现一个“重发失败请求”的功能。

Promise.all(requestPromises).then(...).catch(...) 会在所有requestPromises都resolve时才会进then方法,并且把所有结果以一个数组返回。只要有一个失败,就会进catch。如果在单个请求中定义了catch方法,那么就不会进Promise.all的catch方法。因此,可以在单个的catch中将失败的promise放入一个list,待一轮请求完成后,再去请求失败的请求。

let failedList = []
function getDataById (id) { // 这是单个请求
 return new Promise(function (resolve, reject) {
  getResponse(id, resolve, reject)
 }).catch(e => {
  failedList.push(arguments.callee(id)) // 如果失败,就重新发起请求,并将该请求的promise放入failedList中以便后续处理
 })
}
function getResponse (id, resolve, reject) { // 模拟返回结果
 setTimeout(() => {
  if (Math.random() > 0.8) resolve({id, msg: 'ok'})
  else reject({id, msg: 'error'})
 }, 1000)
}
const RequestList = [getDataById(1), getDataById(2), getDataById(3)]
fetchData(RequestList)
let counter = 1 // 请求次数
let maxRequestTimes = 5 // 最大请求次数,因为有可能别个页面就是访问不了,请求多少次也没用- - 
let result = [] // 最后的结果
function fetchData (requestList) { // 这里是对请求结果的处理
 Promise.all(requestList).then(resolve => {
  result = result.concat(resolve.filter(i => i)) // filter返回true的时候保留该数组项,因为getDataById的catch里没有给返回值(这里也不需要),这里的resolve里就会有undefined,需要过滤掉
  let failedLength = failedList.length
  if (failedLength > 0 && counter < maxRequestTimes) { // 如果失败列表里有请求,并且请求次数不超过设定的值,就进行下一次请求,并且打出log
   console.log(`第${counter}次请求完成,其中成功${RequestList.length - failedLength}个,失败${failedLength}个,正在进行第${++counter}次请求...`)
   fetchData(failedList)
   failedList = [] // 这里要清空failedList,不然会一直调用。不用担心,下一次请求失败的会在getDataById填充到failedList里。
  } else { // 表示所有请求都成功了,或者达到了最大请求次数。到这里就可以对result做进一步处理了。
   console.log(`请求完成,共请求${counter}次, 其中成功${RequestList.length - failedLength}个,失败${failedLength}个\n`, result)
   counter = 1
  }
 }).catch(e => {
  console.log(e)
 })
}

Promise.all中对于reject的处理方法

总结

以上所述是小编给大家介绍的Promise.all中对于reject的处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript之文件操作
Mar 07 Javascript
jQuery简单图表peity.js使用示例
May 02 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
Oct 08 Javascript
javascript自定义滚动条实现代码
Apr 20 Javascript
js实现简单的省市县三级联动效果实例
Feb 18 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
JS中如何实现Laravel的route函数详解
Feb 12 Javascript
AngularJS 限定$scope的范围实例详解
Jun 23 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
React中使用UEditor百度富文本的方法
Aug 22 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
Sep 05 Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 Javascript
详解es6超好用的语法糖Decorator
Aug 01 #Javascript
Vue Router去掉url中默认的锚点#
Aug 01 #Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 #Javascript
node.js遍历目录的方法示例
Aug 01 #Javascript
深入浅出理解JavaScript闭包的功能与用法
Aug 01 #Javascript
Angular路由ui-router配置详解
Aug 01 #Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
Aug 01 #Javascript
You might like
substr()函数中文版
2006/10/09 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
Python map和reduce函数用法示例
2015/02/26 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
python实现大学人员管理系统
2019/10/25 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
中国文明网签名寄语
2014/01/18 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
2014年建筑工作总结
2014/11/26 职场文书
辞职信怎么写
2015/02/27 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
公司职员入党自传书
2015/06/26 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers