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 相关文章推荐
提高代码性能技巧谈—以创建千行表格为例
Jul 01 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 Javascript
JavaScript实现多维数组的方法
Nov 20 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
Sep 06 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
浅谈React碰到v-if
Nov 04 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
Feb 26 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 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 set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
详解python多线程之间的同步(一)
2019/04/03 Python
python简单验证码识别的实现方法
2019/05/10 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
SQL面试题
2013/12/09 面试题
毕业自我评价
2014/02/05 职场文书
空气的环保标语
2014/06/12 职场文书
离婚协议书范文2014
2014/10/16 职场文书
高中政治教学反思
2016/02/23 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python