在前端开发中,异步操作是一个不可避免的问题。为了更好地处理异步操作,JavaScript提供了Promise,它能够处理异步请求,我们可以通过then链式地进行处理。在ES10中,新增加了Promise.all()和Promise.race()方法,分别用来处理多个Promise的并行请求和竞争请求。
1. Promise.all()
Promise.all()方法接收一个包含多个Promise的数组,返回一个新的Promise。该返回的Promise会在所有Promise都执行完成后resolve这个数组,其中包含着每个Promise执行结果的数据。如果其中任意一个Promise失败,则整个Promise.all()的结果将会是一个rejected状态。
下面是一个Promise.all()方法的示例代码:
const promise1 = new Promise(resolve => setTimeout(resolve, 500, 'foo')); const promise2 = new Promise(resolve => setTimeout(resolve, 200, 'bar')); const promise3 = new Promise(resolve => setTimeout(resolve, 1000, 'baz')); Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values); // ['foo', 'bar', 'baz'] });
在上述示例代码中,Promise.all()方法接收三个Promise实例的数组,并在都完成后返回一个包含了每个Promise执行结果的数据。
2. Promise.race()
相比Promise.all()方法的等待全部Promise完成,Promise.race()方法是只要其中任意一个Promise完成,无论成功或是失败,Promise.race()主体就会进入对应的状态。Promise.race()方法同样返回一个Promise实例。
下面是一个Promise.race()方法的示例代码:
-- -------------------- ---- ------- ----- -------- - --- --------------- -- ------------------- ---- -------- ----- -------- - --- --------------- -- ------------------- ---- -------- ----- -------- - --- ----------------- ------- -- ------------------ ----- ---------- ----------------------- --------- ----------------------- -- - ------------------- -- ----- ---------------- -- - ------------------- -- ------- ---
在上述示例代码中,Promise.race()方法接收三个Promise实例的数组。因为promise2先完成,所以Promise.race()的结果就是'bar',而不是需要等到全部完成。
3. 结论
Promise.all()和Promise.race()是两个在处理多个Promise时非常实用的方法。Promise.all()适用于想要等待所有Promise完成后获得结果的场景,Promise.race()适用于想先获得最快Promise结果的场景。我们可以灵活地使用它们,帮助我们处理异步请求,提高代码效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66eed0bd6fbf9601972acce4