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 相关文章推荐
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 Javascript
javascript中substr,substring,slice.splice的区别说明
Nov 25 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
Dec 28 Javascript
JQuery中DOM事件绑定用法详解
Jun 13 Javascript
jQuery实现提示密码强度的代码
Jul 15 Javascript
用JS动态改变表单form里的action值属性的两种方法
May 25 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
jQuery实现的网页换肤效果示例
Sep 20 Javascript
VueJs与ReactJS和AngularJS的异同点
Dec 12 Javascript
JS二叉树的简单实现方法示例
Apr 05 Javascript
jQuery 实现左右两侧菜单添加、移除功能
Jan 02 jQuery
vue实现点击关注后及时更新列表功能
Jun 26 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
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
php做下载文件的实现代码及文件名中乱码解决方法
2011/02/03 PHP
使用PHP编写的SVN类
2013/07/18 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
原生javascript如何实现共享onload事件
2020/07/03 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
django配置app中的静态文件步骤
2020/03/27 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
商务专员岗位职责
2013/11/23 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
产品质量保证书
2014/04/29 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
售房委托书
2014/08/30 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Python如何把不同类型数据的json序列化
2021/04/30 Python
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Pandas自定义选项option设置
2021/07/25 Python
Java Redisson多策略注解限流
2022/09/23 Java/Android