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 相关文章推荐
JavaScript RegExp方法获取地址栏参数(面向对象)
Mar 10 Javascript
JAVASCRIPT style 中visibility和display之间的区别
Jan 22 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
Dec 15 Javascript
JS中不为人知的五种声明Number的方式简要概述
Feb 22 Javascript
动态加载js的方法汇总
Feb 13 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
基于Javascript实现二级联动菜单效果
Mar 04 Javascript
三种带箭头提示框总结实例
Jun 14 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
Bootstrap导航条学习使用(二)
Feb 08 Javascript
Node.js中环境变量process.env的一些事详解
Oct 26 Javascript
快速解决处理后台返回json数据格式的问题
Aug 07 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&amp;&amp;mysql)二
2006/10/09 PHP
php项目打包方法
2008/02/18 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python查看微信好友是否删除自己
2016/12/19 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
Django异步任务线程池实现原理
2019/12/17 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
医科大学生的自我评价
2013/12/04 职场文书
合伙协议书
2014/04/23 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
学校通报表扬范文
2015/05/04 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
python字典的元素访问实例详解
2021/07/21 Python