自行实现Promise.allSettled的Polyfill处理

目录
  • 引言
  • Promise.race
  • Promise.any

引言

如果因为浏览器太过老旧,不支持最新的 Promise.allSettled API,我们可以使用 polyfill 技术,简单地自己用 Promise.all, 自行实现 Promise.allSettled.

完整代码实现如下:

if (!Promise.allSettled) {
  const rejectHandler = reason => ({ status: 'rejected', reason });
  const resolveHandler = value => ({ status: 'fulfilled', value });
  Promise.allSettled = function (promises) {
    const convertedPromises = promises.map(p => Promise.resolve(p).then(resolveHandler, rejectHandler));
    return Promise.all(convertedPromises);
  };
}

在这段代码中,promises.map 接受输入值,使用 p => Promise.resolve(p) 将它们转换为 Promise(以防传递了非 Promise 类型的 primitive 值),然后将 .then 处理程序添加到每个值。

该处理程序将成功的结果值转换为 {status:'fulfilled', value},并将错误原因转换为 {status:'rejected', reason}。 这正是 Promise.allSettled 的格式。

现在我们可以使用 Promise.allSettled 来获取所有给定 Promise 的结果,即使其中一些被 reject.

Promise.race

与 Promise.all 类似,但仅等待第一个已经 resolved 的 Promise 并获取其结果(或错误)。

语法:

let promise = Promise.race(iterable);

下列代码将会打印第一个状态变为 fulfilled 的 Promise 的值,即1:

Promise.race([
  new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 2000)),
  new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1

这里的第一个promise是最快的,所以就变成了结果。 在第一个确定的 Promise win the race之后,所有进一步的结果/错误都将被忽略。

Promise.any

与 Promise.race 类似,但只等待第一个 fulfilled 的 Promise 并获得其结果。 如果所有给定的 Promise 都被拒绝,则返回的 Promise 会被 AggregateError 拒绝——这是一个特殊的错误对象,它将所有 Promise 错误存储在它的 errors 属性中。

语法:

let promise = Promise.any(iterable);

下列例子结果为1:

Promise.any([
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 1000)),
  new Promise((resolve, reject) => setTimeout(() => resolve(1), 2000)),
  new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1

这里的第一个promise是最快的,但是被 reject 了,所以第二个promise就变成了结果。 在第一个 fulfilled 的 Promise win the race 之后,所有进一步的结果都将被忽略。

这是一个所有 Promise 都失败的例子:

Promise.any([
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("Ouch!")), 1000)),
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("Error!")), 2000))
]).catch(error => {
  console.log(error.constructor.name); // AggregateError
  console.log(error.errors[0]); // Error: Ouch!
  console.log(error.errors[1]); // Error: Error!
});

如我们所见,失败的 Promise 的错误对象在 AggregateError 对象的 errors 属性中可用。

以上就是Promise.allSettled 的 Polyfill 处理的详细内容,更多关于Promise.allSettled Polyfill 处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • ES6 Promise.all的使用方法以及其细节详解

    ES6 Promise.all用法 Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调.可以将多个 Promise 实例,包装成一个新的 Promise 实例. const p = Promise.all([p1, p2, p3]); 上面代码中,Promise.all方法接受一个数组作为参数,p1.p2.p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理.(P

  • 面试手写实现Promise.all

    目录 前言 常见面试手写系列 Promise.resolve 简要回顾 源码实现 Promise.reject 简要回顾 源码实现 Promise.all 简要回顾 源码实现 Promise.allSettled 简要回顾 源码实现 Promise.race 简单回顾 源码实现 结尾 前言 (ಥ﹏ಥ)曾经真实发生在一个朋友身上的真实事件,面试官让他手写一个Promise.all,朋友现场发挥不太好,没有写出来,事后他追问面试官给的模糊评价是基础不够扎实,原理性知识掌握较少... 当然整场面试失利

  • Promise.all中对于reject的处理方法

    昨天写了个小爬虫,用axios.all同时请求多个页面时,国内网络的原因很容易就超时然后reject了,佛系resolve不可取啊,然后想到可以实现一个"重发失败请求"的功能. Promise.all(requestPromises).then(...).catch(...) 会在所有requestPromises都resolve时才会进then方法,并且把所有结果以一个数组返回.只要有一个失败,就会进catch.如果在单个请求中定义了catch方法,那么就不会进Promise.all

  • Java实现Promise.all()的示例代码

    JavaScript的Promise.all() Promise是JavaScript异步编程的一种解决方案,在ES6中引入. 通过Promise.all()可以实现对一组异步请求的统一处理,等待所有异步执行完成之后调用回调函数. 其实,这种并发执行同步等待的需求在Java并发编程中也很常见,那么,是否可以通过Java也来实现这样一个Promise类呢? 使用Java实现Promise.all() 使用工具 CountDownLatch:Java并发工具包中有CountDownLatch类允许一

  • 字节飞书面试promise.all实现示例

    目录 前言 何为Promise.all? 原生 Promise.all 测试 手动实现Promise.all 测试案例 Promise.race 原生 Promise.race 测试 手写Promise.race 测试案例 Promise.any 原生 Promise.any 测试 手写Promise.any 测试案例 Promise.allSettled 原生 Promise.allSettled 测试 手写 Promise.allSettled 测试案例 结语 参考文章 前言 金三银四,身为

  • 深入理解Promise.all

    异步之Promise Promise.all Promise.all接收的promise数组是按顺序执行的还是一起执行的,也就是说返回的结果是顺序固定的吗? 目前有两种答案: 应该是同步执行的,但是这样就有效率问题了,如果想改成异步执行怎么办呢? 有些人认为结果是按顺序执行的,有些人认为结果顺序不确定. 那么我们根据实现来解密: 环境为: vscode 1.20.1 node v8.9.0 npm v5.6.0 实验代码: // 获取随机数,toFixed为四舍五入保留小数,0为保留整数,范围-

  • 自行实现Promise.allSettled的Polyfill处理

    目录 引言 Promise.race Promise.any 引言 如果因为浏览器太过老旧,不支持最新的 Promise.allSettled API,我们可以使用 polyfill 技术,简单地自己用 Promise.all, 自行实现 Promise.allSettled. 完整代码实现如下: if (!Promise.allSettled) { const rejectHandler = reason => ({ status: 'rejected', reason }); const r

  • 在vue项目中promise解决回调地狱和并发请求的问题

    场景需求: 需要同时请求5个接口 都请求成功后执行下一步操作 解决方法: 定义一个变量i=5,请求成功一个接口,让i–,直到i=0时执行下一个操作,否则不执行 axios.all 并发请求,.then(axios.spread(function(callback1, callback2)){}) promise.all 并发请求,.then(function([callback1, callback2]){}) 1.回调地狱: 函数作为参数层层嵌套 代替的为.then的链式操作 2.promis

  • Javascript异步编程之你真的懂Promise吗

    前言 在异步编程中,Promise 扮演了举足轻重的角色,比传统的解决方案(回调函数和事件)更合理和更强大.可能有些小伙伴会有这样的疑问:2020年了,怎么还在谈论Promise?事实上,有些朋友对于这个几乎每天都在打交道的"老朋友",貌似全懂,但稍加深入就可能疑问百出,本文带大家深入理解这个熟悉的陌生人-- Promise. 基本用法 语法 new Promise( function(resolve, reject) {...} /* executor */ ) 构建 Promise

  • 前端JavaScript之Promise

    目录 1.什么是Promise 2.基本用法 3.Promise的方法 3.1 Promise.prototype.then() 3.2 Promise.prototype.catch() 3.3 Promise.prototype.finally() 3.4 Promise.all() 3.5 Promise.race() 3.6 Promise.allSettled() 3.7 Promise.any() 3.8 Promise.resolve() 3.9 Promise.reject()

  • JS Promise axios 请求结果后面的.then() 是什么意思

    目录 Promise 对象 Promise 对象的状态 回调函数 Promise.then() 绑定回调函数 使用 Promise:链式调用 链式调用的实现 错误处理 常见错误 创建 Promise 对象 Promise 其他静态方法 创建已决议的 Promise 对象 多个 Promise 对象 结语&参考文献 Promise 是JS中一种处理异步操作的机制,在现在的前端代码中使用频率很高.Promise 这个词可能有点眼生,但你肯定见过 axios.get(...).then(res =>

  • JavaScript中Promise的使用方法实例

    目录 前言 Promise简介 什么是回调地狱? Promise的特点 创建Promise实例 then方法 resolve 和 reject 的参数传递 then()链式调用 then()的返回值 catch方法 finally方法 Promise的方法 Promise.resolve() Promise.reject() Promise.all() Promise.allSettled() Promise.race() async 和 await async函数函数 await 异步函数的错

  • 深入学习JavaScript中的promise

    目录 为什么要用Promise? 使用Promise解决异步控制问题 Promise的结构 回调函数 为什么异步代码一定是回调函数结构? 刨析Promise 原型方法——catch\finally\then 为什么要在.then的回调函数中return一个Promise呢? 那如果我们不指明return返回值,它会返回什么呢?是如何实现链式调用呢? resolve和reject resolve() reject() Promise常用API——all().allSettled().any().r

  • Promise静态四兄弟实现示例详解

    目录 前言 Promise.all 基础学习 Iterator 接口参数 思路分析 源码实现 Promise.allSettled 基础学习 思路分析 源码实现 Promise.race 基础学习 思路分析 源码实现 Promise.any 基础学习 思路分析 源码实现 前言 恰逢 Promise 也有四个很像的静态三兄弟(Promise.all.Promise.allSettled.Promise.race.Promise.any),它们接受的参数类型相同,但各自逻辑处理不同,它们具体会有什么

随机推荐