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 相关文章推荐
js中获取事件对象的方法小结
Mar 13 Javascript
映彩衣的js随笔(js图片切换效果)
Jul 31 Javascript
js修改地址栏URL参数解决url参数问题
Dec 15 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
Node.js创建HTTP文件服务器的使用示例
May 11 Javascript
JavaScript中click和onclick本质区别与用法分析
Jun 07 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 jQuery
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
详解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
优化使用mysql存储session的php代码
2008/01/10 PHP
QueryPath PHP 中的jQuery
2010/04/11 PHP
PHP学习之正则表达式
2011/04/17 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
绝对经典成功的大学生推荐信
2013/11/08 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
自我鉴定标准格式
2014/03/19 职场文书
我的祖国演讲稿
2014/05/04 职场文书
组织鉴定材料
2014/06/02 职场文书
三下乡个人总结
2015/03/04 职场文书
销售会议开幕词
2016/03/04 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
element多个表单校验的实现
2021/05/27 Javascript
用Python可视化新冠疫情数据
2022/01/18 Python