ES9 中新增了 Promise.allSettled() 方法,它可以让我们更方便地处理多个 Promise 的结果。
在之前的 Promise.all() 中,当其中一个 Promise 被 reject 时,整个 Promise.all() 也会失败,并返回该 Promise 的错误信息,而 Promise.allSettled() 则不同,不论 Promise 的状态是 fulfilled 还是 rejected,它都会等待所有 Promise 执行完毕,并返回一个数组,该数组中的每个元素都包含了这些 Promise 的状态以及结果或错误信息。
Promise.allSettled() 的参数是一个 Promise 数组,以一个简单的示例说明如下:
const promises = [ Promise.resolve('Promise 1 resolved'), Promise.reject('Promise 2 rejected'), Promise.resolve('Promise 3 resolved'), ]; Promise.allSettled(promises) .then(results => console.log(results)) .catch(error => console.error(error));
结果输出:
[ { status: 'fulfilled', value: 'Promise 1 resolved' }, { status: 'rejected', reason: 'Promise 2 rejected' }, { status: 'fulfilled', value: 'Promise 3 resolved' }, ]
Promise.allSettled() 返回的数组中,每个元素都是一个对象,它包含两个属性:status 和 value 或 reason,分别表示 Promise 的状态和结果或错误信息。如果 Promise 被 resolve,那么 status 的值为 'fulfilled',value 的值为 Promise 的结果;如果 Promise 被 reject,那么 status 的值为 'rejected',reason 的值为 Promise 的错误信息。
有了 Promise.allSettled(),我们可以更方便地处理多个 Promise 的结果,例如:
const fetchApiData = url => fetch(url).then(response => response.json()); const urls = [ 'https://jsonplaceholder.typicode.com/todos/1', 'https://jsonplaceholder.typicode.com/todos/2', 'https://jsonplaceholder.typicode.com/todos/3', ]; Promise.allSettled(urls.map(fetchApiData)) .then(results => results.filter(result => result.status === 'fulfilled').map(result => result.value)) .then(console.log) .catch(console.error);
这是一个请求多个 API,然后过滤出请求成功的结果的示例。使用 Promise.allSettled() 的好处在于:
- 不需要使用 try...catch 包裹每个 Promise 的执行结果,避免代码冗长。
- 不用担心某个被 reject 的 Promise 会影响其他 Promise 的执行结果,而要进行额外的处理。
总结
Promise.allSettled() 是 ES9 提供的一个新的方法,它可以更方便地处理多个 Promise 的结果,无论是 fulfilled 还是 rejected 状态,都可以获取到结果或错误信息。使用 Promise.allSettled() 的好处在于代码更加简洁明了,同时也可以避免某个 Promise 造成的异常影响其他 Promise 的执行结果。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a6155dadd4f0e0ffebe48a