当前栏目
Promise.allSettled 的 Polyfill 处理
如果因为浏览器太过老旧,不支持最新的 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 属性中可用。
相关文章
- Oracle ORA-01017 报错处理
- ORA-01268: invalid TEMPFILE clause for alter of permanent TABLESPACE ORACLE 报错 故障修复 远程处理
- ORA-24414: Only number sessions could be started. ORACLE 报错 故障修复 远程处理
- ORA-26892: XStream feature not supported ORACLE 报错 故障修复 远程处理
- ORA-30082: datetime/interval column to be modified must be empty to decrease fractional second or leading field precision ORACLE 报错 故障修复 远程处理
- ORA-31651: communication error with master process – detaching job ORACLE 报错 故障修复 远程处理
- MySQL Error number: 3135; Symbol: ER_SQL_MODE_MERGED; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-010528; Symbol: ER_TC_RESTART_WITHOUT_TC_HEURISTIC_RECOVER; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-011936; Symbol: ER_IB_MSG_111; SQLSTATE: HY000 报错 故障修复 远程处理
- ORA-09764: osnmop: access error on oracle executable ORACLE 报错 故障修复 远程处理
- ORA-13709: Required parameter “string” must be set before execution. ORACLE 报错 故障修复 远程处理
- ORA-14322: DEFAULT partition already exists ORACLE 报错 故障修复 远程处理
- MySQL Error number: MY-013150; Symbol: ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF; SQLSTATE: HY000 报错 故障修复 远程处理