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左侧多级菜单动态的解决方案
Feb 01 Javascript
Ajax提交与传统表单提交的区别说明
Feb 07 Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
Javascript中的async awai的用法
May 17 Javascript
Vue 组件间的样式冲突污染
Aug 31 Javascript
Vue3.0结合bootstrap创建多页面应用
May 28 Javascript
深入了解JavaScript 的 WebAssembly
Jun 15 Javascript
js正则匹配多个全部数据问题
Dec 20 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
2011/10/09 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
jQuery中children()方法用法实例
2015/01/07 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
python实现目录树生成示例
2014/03/28 Python
python开发之str.format()用法实例分析
2016/02/22 Python
Python实现的端口扫描功能示例
2018/04/08 Python
python删除文本中行数标签的方法
2018/05/31 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
Python列表与元组的异同详解
2019/07/02 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
原料仓仓管员岗位职责
2014/07/08 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书