使用 Promise 实现请求自动重试

"use strict";

/**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2020-11-20
* @modified
*
* @description
* @description
* @difficulty Easy Medium Hard
* @complexity O(n)
* @time O(n)
* @augments
* @example
* @link
* @solutions
*
* @best_solutions
*
*/ const log = console.log; const autoRefetch = (url = ``, times = 3) => {
const promise = fetch(url);
promise.then(res => res.json(), err => {
if(times > 0) {
times -= 1;
promise = fetch(url);
}
}).catch(err => {
return Promise.reject(err);
})
return promise;
} function maxRequest(url = ``, times = 3) {
return new Promise((resolve, reject) => {
if (times === 0) {
reject('max request number')
return
}
Promise.resolve(fetch(url)).then(value => {
log(`OK`)
resolve(value);
}).catch(() => {
log(`Error`)
times -= 1;
return maxRequest(url, times)
})
})
} // function maxRequest(fn, maxNum) {
// return new Promise((resolve, reject) => {
// if (maxNum === 0) {
// reject('max request number')
// return
// }
// Promise.resolve(fn()).then(value => {
// resolve(value)
// }).catch(() => {
// return maxRequest(fn, maxNum - 1)
// })
// })
// }

模拟 Promise.all & Promise.allSettled

Promise.all

要么全部 promise 结果都成功了,返回全部的 promise 构成的一个结果值的数组;

要么只要有一个 promise 失败了,就返回失败了的 promise 的 error 值,默认 undefined

一句话总结: 全部 promise 结果都成功了,返回一个有所有成功的结果值的数组; 只要有一个promise 失败了,就的返回失败结果;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

PromiseAll = function(promises) {
const values = [];
let count = 0;
return new Promise((resolve, reject) => {
promises.forEach((promise, index) => {
// promise.then ? 强制转换
Promise.resolve(promise).then(res => {
count += 1;
values[index] = res;
if (count === promises.length) {
resolve(values);
}
}, err => {
reject(err);
})
})
})
} ```js // pending... > Promise.allSettled 返回全部的 promise 的结果,无论 promise 结果是成功还是失败,构成一个可迭代的数组对象 成功的 promise 返回一个有 status: 'fulfilled' 和 value 构成的对象
失败的 promise 返回一个有 status: 'rejected' 和 reason 构成的对象 一句话总结: 无论 promise 是成功了还是失败了, 最终都返回一个有 status 和 value 或 reason 构成的对象数组; https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled ```js PromiseAllSellted = function(promises) {
const result = [];
let count = 0;
return new Promise((resolve, reject) => {
// promise.then ? 强制转换
promises.forEach((promise, index) => {
Promise.resolve(promise).then(res => {
result[index] = {
status: `fullfilled`,
value: res,
}
}, err => {
result[index] = {
status: `rejected`,
reason: err,
}
}).finally(() => {
count++
if (count === promises.length) {
resolve(result)
}
})
})
})
}

Promise.allSettled & Promise.all & Promise.race & Promise.any All In One

https://www.cnblogs.com/xgqfrms/p/13414614.html

refs



xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


最新文章

  1. 精益VS六西格玛
  2. Flex编译程序出现 Could not find compiled resource bundle 'SharedResources' for locale 'en_US'.
  3. 读Thinking in java 4
  4. ASP.NET HTTP模拟提交通用类 GET POST
  5. 移动端H5---页面适配问题详谈(一)
  6. Java for LeetCode 188 Best Time to Buy and Sell Stock IV【HARD】
  7. 水灾(sliker.cpp/c/pas) 1000MS 64MB
  8. poj1328
  9. 上传文件出错:org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
  10. pdf打印乱码问题
  11. [Ioi2007]Miners 矿工配餐(BZOJ1806)
  12. 如何解决自定义ToolBar起始位置的空格(左对齐)问题
  13. oracle基本查询语句总结
  14. 【Vue中的swiper轮播组件】
  15. luogu P5323 [BJOI2019]光线
  16. Azure架构(一):云计算基础
  17. xgboost应用
  18. Python返回数组(List)长度的方法
  19. Linux rhel7 无线网络配置
  20. python之commands模块

热门文章

  1. Seata RPC 模块的重构之路
  2. centos7防火墙firewalld拒绝某ip或者某ip段访问服务器任何服务
  3. jQuery 真伪数组的转换
  4. GStreamer各个包构建
  5. using-pointers-to-remove-item-from-singly-linked-list
  6. P1837 单人纸牌
  7. hibernate+spring+tomcat启动报错Not supported by BasicDataSource
  8. ehCache 配置
  9. 天天写同步,5种SpringMvc异步请求了解下!
  10. Arduino字符串笔记