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相册效果代码(点击创建即可)
Apr 16 Javascript
探讨js字符串数组拼接的性能问题
Oct 11 Javascript
jquery+ajax验证不通过也提交表单问题处理
Dec 12 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
vue实现添加标签demo示例代码
Jan 21 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
layer弹出层全屏及关闭方法
Aug 17 Javascript
JS实现的tab页切换效果完整示例
Dec 18 Javascript
推荐一个基于Node.js的表单验证库
Feb 15 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
微信小程序实现购物车代码实例详解
Aug 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP常用的小程序代码段
2015/11/14 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
大学生优秀团员事迹材料
2014/01/30 职场文书
信息员培训方案
2014/06/12 职场文书
致接力运动员加油稿
2015/07/21 职场文书
计算机教师工作总结
2015/08/13 职场文书