Promise.allSettled 是 ECMAScript 2020 新增的一个 Promise 方法,它可以接收一个 Promise 数组作为参数,返回一个新的 Promise 实例。这个新的 Promise 实例会在所有输入的 Promise 都已经被 settled(fulfilled 或 rejected)后 resolve,resolve 的值是一个数组,包含每个 Promise 的结果和状态。
Promise.allSettled 可以用于处理多个异步请求并行执行,等待所有请求完成后再进行下一步操作。在本文中,我们将介绍 Promise.allSettled 的使用方法以及一个实际的应用场景。
Promise.allSettled 的使用方法
Promise.allSettled 的使用方法非常简单,只需要将需要并行执行的 Promise 数组作为参数传入即可:
// javascriptcn.com 代码示例 const promises = [ Promise.resolve('success'), Promise.reject(new Error('failure')), Promise.resolve('another success') ]; Promise.allSettled(promises) .then(results => { console.log(results); });
上面的代码中,我们创建了一个包含三个 Promise 的数组,其中第二个 Promise 是一个 rejected 状态的 Promise。我们将这个数组作为参数传入 Promise.allSettled 中,并在 then 方法中打印结果。
运行上面的代码会输出如下结果:
[ { status: 'fulfilled', value: 'success' }, { status: 'rejected', reason: Error: failure at <anonymous>:3:19> }, { status: 'fulfilled', value: 'another success' } ]
可以看到,返回的结果是一个数组,包含三个对象,每个对象代表一个 Promise 的结果和状态。对象中包含两个属性,status 表示 Promise 的状态,可以是 fulfilled 或 rejected,value 或 reason 分别表示 Promise 的结果或拒因。
Promise.allSettled 的应用场景
Promise.allSettled 可以用于处理多个异步请求并行执行的情况,等待所有请求完成后再进行下一步操作。在实际的应用场景中,我们可以将 Promise.allSettled 和一些其他的异步编程技巧结合起来使用,以实现更加复杂的异步操作。
下面是一个示例代码,演示了如何使用 Promise.allSettled 实现一个异步的数据验证功能:
// javascriptcn.com 代码示例 async function validateData(data) { const promises = [ validateField1(data.field1), validateField2(data.field2), validateField3(data.field3) ]; const results = await Promise.allSettled(promises); const errors = results .filter(result => result.status === 'rejected') .map(result => result.reason.message); if (errors.length > 0) { throw new Error(errors.join(', ')); } return true; } async function validateField1(field1) { if (field1 === null || field1 === undefined) { throw new Error('Field1 is required'); } return true; } async function validateField2(field2) { if (field2.length < 5) { throw new Error('Field2 must be at least 5 characters long'); } return true; } async function validateField3(field3) { if (!isValidEmail(field3)) { throw new Error('Field3 must be a valid email address'); } return true; }
上面的代码中,我们定义了一个 validateData 函数,用于验证一个包含多个字段的数据对象。validateData 函数接收一个数据对象作为参数,并返回一个 Promise,这个 Promise 在所有字段验证完成后 resolve,resolve 的值是 true,验证失败时 reject,reject 的值是一个包含所有错误信息的 Error 对象。
validateData 函数内部调用了三个异步的验证函数 validateField1、validateField2 和 validateField3,这些函数分别验证三个不同的字段,并返回一个 Promise。我们将这些 Promise 放入一个数组中,将数组作为参数传入 Promise.allSettled 中。然后我们过滤出所有 rejected 状态的 Promise,将错误信息提取出来,合并成一个 Error 对象并抛出。如果所有验证都通过,返回 true。
总结
本文介绍了 ECMAScript 2020 中 Promise.allSettled 的异步编程应用实例,包含了 Promise.allSettled 的使用方法和一个实际的应用场景。Promise.allSettled 可以用于处理多个异步请求并行执行的情况,等待所有请求完成后再进行下一步操作。在实际的应用场景中,我们可以将 Promise.allSettled 和一些其他的异步编程技巧结合起来使用,以实现更加复杂的异步操作。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65866b56d2f5e1655d0e48f5