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 相关文章推荐
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
Oct 13 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
Feb 21 Javascript
小米公司JavaScript面试题
Dec 29 Javascript
js实现文件上传表单域美化特效
Nov 02 Javascript
JavaScript动态插入CSS的方法
Dec 10 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
微信小程序 flex实现导航实例详解
Apr 26 Javascript
浅谈关于angularJs中使用$.ajax的注意点
Aug 12 Javascript
JavaScript编写的网页小游戏,很给力
Aug 18 Javascript
token 机制和实现方式
Dec 15 Javascript
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
详解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中处理模拟rewrite 效果
2006/12/09 PHP
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
PHP实现文件上传与下载
2020/08/28 PHP
jQuery 位置插件
2008/12/25 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
职员竞岗演讲稿
2014/05/14 职场文书
踏青活动策划方案
2014/08/19 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
春节晚会开场白
2015/05/29 职场文书