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对象的property和prototype是这样一种关系
Mar 24 Javascript
js优化针对IE6.0起作用(详细整理)
Dec 25 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
Feb 19 Javascript
jquery默认校验规则整理
Mar 24 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
Aug 10 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
Aug 08 Javascript
js oncontextmenu事件使用详解
Mar 25 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
微信小程序文章列表功能完整实例
Jun 03 Javascript
详解如何解决使用JSON.stringify时遇到的循环引用问题
Mar 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 动态多文件上传
2009/01/18 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
php include类文件超时问题处理
2015/02/06 PHP
php实现cookie加密的方法
2015/03/10 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
python打包多类型文件的操作方法
2020/09/21 Python
Python实现简单猜数字游戏
2021/02/03 Python
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
装修施工安全责任书
2014/07/24 职场文书
2015年宣传工作总结
2015/04/08 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
年终工作总结范文
2019/06/20 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书