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,超强推荐base.js
Dec 23 Javascript
js弹出窗口之弹出层的小例子
Jun 17 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
js使用post 方式打开新窗口
Feb 26 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
Aug 29 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
详解VueJs前后端分离跨域问题
May 24 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
微信小程序实现分享朋友圈的图片功能示例
Jan 18 Javascript
Node.js安装详细步骤教程(Windows版)详解
Sep 01 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
通过文字传递创建的图形按钮
2006/10/09 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
laravel入门知识点整理
2020/09/15 PHP
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
Python-opencv 双线性插值实例
2020/01/17 Python
Python实现分数序列求和
2020/02/25 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
Python常用外部指令执行代码实例
2020/11/05 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
Android面试宝典
2013/08/06 面试题
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
我的长生果教学反思
2014/04/28 职场文书
兽医医药专业求职信
2014/07/27 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
典型事迹材料范文
2014/12/29 职场文书
学校计划生育责任书
2015/05/09 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python