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 常用函数
Dec 30 Javascript
用js实现输入提示(自动完成)的实例代码
Jun 14 Javascript
JavaScript获取多个数组的交集简单实例
Nov 11 Javascript
jquery中get和post的简单实例
Feb 04 Javascript
jQuery判断元素是否存在的可靠方法
May 06 Javascript
jquery实现侧边弹出的垂直导航
Dec 09 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
Jan 18 Javascript
javascript基础语法——全面理解变量和标识符
Jun 02 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
Dec 01 Javascript
20个必会的JavaScript面试题(小结)
Jul 02 Javascript
Vue移动端实现图片上传及超过1M压缩上传
Dec 23 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
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
Using the TextRange Object
2006/10/14 Javascript
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
js获取域名的方法
2015/01/27 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
Python解释执行原理分析
2014/08/22 Python
Python 的 Socket 编程
2015/03/24 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
财务科科长岗位职责
2014/03/10 职场文书
入党介绍人评语
2014/05/06 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
家长学校培训材料
2014/08/20 职场文书
协会周年庆活动方案
2014/08/26 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python