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 - HTML的request类
Jan 09 Javascript
使用Javascript接收get传递的值的代码
Nov 30 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
js实现的万能flv网页播放器代码
Apr 30 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
微信小程序 页面滑动事件的实例详解
Oct 12 Javascript
vue使用Google地图的实现示例代码
Dec 19 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
vue中的面包屑导航组件实例代码
Jul 01 Javascript
微信小程序实现侧边栏分类
Oct 21 Javascript
基于javascript原生判断DOM是否加载完毕
Oct 14 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 adodb操作mysql数据库
2009/03/19 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
php格式化json函数示例代码
2016/05/12 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
javascript获取选中的文本的方法代码
2013/10/30 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
SQL数据库笔试题
2016/03/08 面试题
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
中学生期末评语
2014/02/03 职场文书
邀请书格式范文
2015/02/02 职场文书
创业计划书之服装
2019/10/07 职场文书