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 相关文章推荐
jQuery对象和DOM对象相互转化
Apr 24 Javascript
javascript 面向对象编程 function也是类
Sep 17 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
jQuery中get()方法用法实例
Dec 27 Javascript
JavaScript实现查找字符串中第一个不重复的字符
Dec 29 Javascript
JS实现的仿淘宝交易倒计时效果
Nov 27 Javascript
javascript实现瀑布流加载图片原理
Feb 02 Javascript
WEB前端实现裁剪上传图片功能
Oct 17 Javascript
jquery仿微信聊天界面
May 06 jQuery
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
Vue中对iframe实现keep alive无刷新的方法
Jul 23 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
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
Javascript读取cookie函数代码
2010/10/16 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
javascript中call和apply的用法示例分析
2015/04/02 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
浅谈sass在vue注意的地方
2017/08/10 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
vue中轮训器的使用
2019/01/27 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
Python3 能振兴 Python的原因分析
2014/11/28 Python
详细介绍Python的鸭子类型
2016/09/12 Python
python 中random模块的常用方法总结
2017/07/08 Python
Python中psutil的介绍与用法
2019/05/02 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
Python3内置模块random随机方法小结
2019/07/13 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
中专生自我鉴定
2013/12/17 职场文书
高校十八大报告感想
2014/01/27 职场文书
销售会议开幕词
2015/01/28 职场文书
合理化建议书
2015/02/04 职场文书
工作失职自我检讨书
2015/05/05 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang