什么是 Promise.allSettled() 方法?
Promise.allSettled() 是 ES11 中新增的一个 Promise 方法,用于处理多个 Promise 并发执行后,返回所有 Promise 状态(包括成功和失败)的结果。
与 Promise.all() 方法的区别
Promise.all() 方法返回一个新的 Promise 对象,只有当所有 Promise 对象都完成(即状态变为 fulfilled),新的 Promise 对象才会返回成功(resolve)。
但是,如果其中一个 Promise 对象失败(即状态变为 rejected),那么整个 Promise.all() 方法也会返回失败(reject),并返回第一个失败的 Promise 对象所产生的错误信息。
与之不同的是,Promise.allSettled() 方法返回一个新的 Promise 对象,在所有 Promise 对象都完成(即状态变为 fulfilled 或 rejected)后,新的 Promise 对象才会返回成功(resolve)。同时,这个新的 Promise 对象的结果中,包含了所有 Promise 对象的状态和结果信息。
Promise.allSettled() 的语法和用法
Promise.allSettled(iterable)
参数 iterable 是一个可以迭代的对象,比如 Array 或 Set 等,它的成员都是 Promise 对象。Promise.allSettled() 方法返回一个新的 Promise 对象,它会等到所有的 Promise 对象都完成后才会调用回调函数。
以下是一个使用 Promise.allSettled() 方法的例子:
let promise1 = Promise.resolve(1); let promise2 = Promise.reject('error'); let promise3 = Promise.resolve('hello'); Promise.allSettled([promise1, promise2, promise3]) .then(results => results.forEach(result => console.log(result)));
在Promise.allSettled() 方法中,变量 results 保存了每个 Promise 对象的状态和结果信息:
- 如果 Promise 对象成功完成,则结果信息如下:{status: 'fulfilled', value: fulfilledValue}
- 如果 Promise 对象失败,则结果信息如下:{status: 'rejected', reason: rejectedReason}
以上例子的结果如下:
{status: 'fulfilled', value: 1} {status: 'rejected', reason: 'error'} {status: 'fulfilled', value: 'hello'}
Promise.allSettled() 方法的注意点
- Promise.allSettled() 方法仍旧是并发执行的,即所有 Promise 对象同时开始执行。
- 在 Promise.allSettled() 方法中,每个 Promise 对象都会返回结果,无论成功或失败。
- Promise.allSettled() 方法返回的 Promise 对象总是成功(resolve),即使其中有一个 Promise 对象的状态是 reject。
- Promise.allSettled() 方法可以用于检测多个 Promise 对象的执行状态,以便进行下一步的处理逻辑。
总结
Promise.allSettled() 方法是 ES11 中新增的一个 Promise 方法,用于处理多个 Promise 并发执行后,返回所有 Promise 状态的结果。与 Promise.all() 方法不同之处在于,Promise.allSettled() 方法返回的 Promise 对象中包含了所有 Promise 对象的执行状态和结果信息。
你可以使用 Promise.allSettled() 方法来检测多个 Promise 对象的执行状态并作出相应的处理。了解 Promise.allSettled() 方法的相关知识,有助于你更好地使用 Promise 对象进行并发处理。
示例代码
let promise1 = Promise.resolve(1); let promise2 = Promise.reject('error'); let promise3 = Promise.resolve('hello'); Promise.allSettled([promise1, promise2, promise3]) .then(results => results.forEach(result => console.log(result)));
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6480686348841e9894fdf971