简介
随着 JavaScript 应用不断扩大和复杂度上升,Promise 成为了一种非常重要的异步编程工具。随着 ES2020 的到来,Promise 增加了两个新的方法:Promise.allSettled() 和 Promise.any()。
Promise.allSettled() 解决了 Promise.all() 的一些限制,它返回所有 Promise 都已经 settle 的数组,包括 resolved 和 rejected,而不是只有当所有的 Promise 都 resolved 或者有一个 rejected 时才返回。
Promise.any() 返回第一个 settled 的 Promise(resolved 或 rejected),而不是像 Promise.race() 那样返回第一个完成(resolved 或 rejected)的 Promise。
这两个新方法对于前端开发中处理异步操作时非常有用。
Promise.allSettled()
Promise.allSettled() 方法接受一个 Promise 数组,并返回一个新的 Promise,该 Promise 解析为一个数组,其元素是每个指定的 Promise 执行结果的描述符对象,包括状态和结果值。
语法如下:
Promise.allSettled(iterable);
其中 iterable 为一个可迭代对象,如数组。
返回值如下所示:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', reason: 'failed' }, { status: 'fulfilled', value: 3 } ]
其中每个描述符对象有两个属性,一个是 status,表示 Promise 的状态,它有两个值:fulfilled(解析)或 rejected(拒绝);另一个是 value 或 reason,表示 Promise resolve 或 reject 的值。
下面是一个使用 Promise.allSettled() 的示例代码:
-- -------------------- ---- ------- ----- -------- - - ------------------- ------------------------- ------------------ -- ---------------------------- --------------- -- - ------------------------ -- - -------------------------- ------------ -- --------------- --- ---
输出结果为:
fulfilled 1 rejected failed fulfilled 3
上面的代码中,即使 Promise.reject() 产生了一个 rejected Promise, Promise.allSettled() 仍然会返回一个由所有 Promise 处理结果组成的数组,而不会抛出一个错误。
Promise.any()
Promise.any() 方法同样接受一个 Promise 数组,并返回一个新的 Promise 实例。只要参数数组中的 Promise 之一被解析,Promise.any() 就会解析,并返回解析的 Promise 的值。
语法如下:
Promise.any(iterable);
其中 iterable 为一个可迭代对象,如数组。
返回值为第一个完成的 Promise 的值,不管是 resolve 还是 reject。
下面是一个使用 Promise.any() 的示例代码:
-- -------------------- ---- ------- ----- -------- - - --- ----------------- ------- -- ------------------ ----- ---------- --- ----------------- ------- -- ------------------- ---- ----------- --- ----------------- ------- -- ------------------- ---- --------- -- --------------------- -------------- -- -------------------- -------------- -- --------------------
输出结果为:
Second
上面的代码中,Promise.any() 会等待传入的 Promise 数组中的某个 Promise 状态变更,并解析为该 Promise 的值。
注意事项
有一些需要注意的地方:
- Promise.allSettled() 不支持 IE11 及以下版本。
- Promise.any() 还没有被所有主流浏览器所支持,使用之前请进行兼容性测试。
结论
Promise 是 JavaScript 中非常实用的一个功能,两个新方法 Promise.allSettled() 和 Promise.any() 提供了对 Promise 功能的扩展,使得开发者们可以更好地掌控异步操作。
参考资料
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6775f6f06d66e0f9aa07f2bc