在前端开发中,我们经常会使用 Promise 对象来处理异步操作。而在实际的开发过程中,我们会遇到需要同时处理多个 Promise 对象的情况。ES9(ECMAScript 2018)为我们提供了一些方便的技巧,帮助我们更好地处理多个 Promise 对象。
1. Promise.allSettled() 方法
在 ES9 中,Promise 对象新增了一个 allSettled 方法,该方法接收一个 Promise 数组作为参数,返回一个新的 Promise 对象。当传入的所有 Promise 对象都变为 settled(即 fulfilled 或 rejected 状态)时,返回的 Promise 对象会把所有 Promise 对象的状态结果(无论成功或失败)汇集成一个数组返回。
使用示例:
// www.javascriptcn.com code example
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error'));
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'success'));
Promise.allSettled([promise1, promise2, promise3])
.then(results => console.log(results));
// Results:
// [
// {status: 'fulfilled', value: 3},
// {status: 'rejected', reason: 'error'},
// {status: 'fulfilled', value: 'success'}
// ]2. Promise.any() 方法
在 ES9 中,Promise 对象新增了一个 any 方法,该方法接收一个 Promise 数组作为参数,返回一个新的 Promise 对象。当传入的所有 Promise 对象中有任意一个变为 fulfilled(即成功状态),返回的 Promise 对象会将该 Promise 对象的结果(value)直接返回。如果所有 Promise 对象都变为 rejected(即失败状态),Promise.any() 返回的 Promise 对象会抛出一个 AggregateError 异常,其中包含所有 Promise 对象的错误信息。
使用示例:
const promise1 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error1')); const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'success')); const promise3 = new Promise((resolve, reject) => setTimeout(reject, 1000, 'error2')); Promise.any([promise1, promise2, promise3]) .then(result => console.log(result)) .catch(error => console.error(error)); // Output: 'success'
3. Promise.all() 扩展语法
在 ES9 中,数组的扩展语法(Spread Syntax,即 ‘...’)可以用于 Promise.all() 中。使用该语法,我们可以用更简洁的方式传入 Promise 数组。
使用示例:
const arrayOfPromises = [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]; Promise.all([...arrayOfPromises, Promise.resolve(4)]) .then(results => console.log(results)); // Output: [1, 2, 3, 4]
指导意义
ES9 中新增的处理多个 Promise 对象的技巧,使得我们可以更方便地处理多个异步操作,并更好地控制代码流程和错误处理。我们需要在实际开发中学习和掌握这些新特性,并多结合实例练手,以提高前端开发的效率和水平。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d63f79a941bf7134bf1440