深入理解Promise.all和Promise.race

本文详细介绍了JavaScript中的Promise,包括其基本概念、Promise.race()和Promise.all()的使用,展示了如何通过这两种方法优雅地处理异步任务和并发操作。
摘要由CSDN通过智能技术生成

theme: fancy

在现代的JavaScript编程中,处理异步操作是一个常见的任务。为了更加优雅地处理异步代码,ES6引入了Promise这一概念,它是一种用于处理异步操作的设计模式,提供了一种更结构化、更可靠的方式来处理异步任务。本文将深入探讨JavaScript中的Promise以及其两个常用方法:Promise.race()Promise.all()

1. Promise基础概念

Promise是一种表示异步操作的对象,它可以处于三种状态之一:待定(pending)、已解决(fulfilled)和已拒绝(rejected)。在创建一个Promise时,我们可以通过传递一个执行函数来定义异步操作,这个函数接收两个参数:resolverejectresolve 用于将Promise从待定状态变为已解决状态,而 reject 用于将Promise变为已拒绝状态。

下面是一个简单的示例,展示了如何创建和使用一个Promise:

```js const myPromise = new Promise((resolve, reject) => { setTimeout(() => { const randomNumber = Math.random(); if (randomNumber > 0.5) { resolve(randomNumber); } else { reject('Random number is too small'); } }, 1000); });

myPromise.then(result => { console.log('Resolved:', result); }).catch(error => { console.error('Rejected:', error); }); ```

2. Promise.race():竞速解决

Promise.race() 方法允许我们同时发起多个异步操作,并在其中一个操作解决(fulfilled)或拒绝(rejected)时得到结果。它的语法如下: js Promise.race([promise1, promise2, ...])

其中,promise1promise2等为Promise对象数组。新的Promise的状态将与第一个解决或拒绝的Promise的状态相同。

考虑这样一个场景,我们需要从多个数据源获取数据,但只关心最快返回的结果。这时,Promise.race() 就派上用场了。例如:

```js const fetchDataFromSource1 = fetch('https://source1.com/data'); const fetchDataFromSource2 = fetch('https://source2.com/data'); const fetchDataFromSource3 = fetch('https://source3.com/data');

const racePromise = Promise.race([fetchDataFromSource1, fetchDataFromSource2, fetchDataFromSource3]);

racePromise.then(data => { console.log('Fastest source:', data); }).catch(error => { console.error('Error from fastest source:', error); }); ``` 练习: 2637. 有时间限制的 Promise 对象 - 力扣(LeetCode)

题解:

```js /** * @param {Function} fn * @param {number} t * @return {Function} */ var timeLimit = function (fn, t) { return async function (...args) { var m = [fn(...args), new Promise((resolve, reject) => { setTimeout(() => { reject("Time Limit Exceeded"); }, t); })];

return Promise.race(m)

}

};

/** * const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100); * limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms */ ```

3. Promise.all():等待全部解决

Promise.race()不同,Promise.all() 方法要求传入的所有Promise都必须解决(fulfilled)才能得到结果,否则,只要有一个Promise被拒绝(rejected),整个新的Promise就会被拒绝。

使用Promise.all() 可以同时发起多个异步操作,然后等待它们全部完成。这在需要同时获取多个资源并等待全部资源准备好时非常有用。

下面是一个示例,展示如何使用Promise.all() 并行请求多个API数据:

```js const fetchUserData = fetch('https://api.com/user'); const fetchPosts = fetch('https://api.com/posts'); const fetchComments = fetch('https://api.com/comments');

const allPromise = Promise.all([fetchUserData, fetchPosts, fetchComments]);

allPromise.then(responses => { const [userData, posts, comments] = responses; console.log('User data:', userData); console.log('Posts:', posts); console.log('Comments:', comments); }).catch(error => { console.error('Error:', error); }); ```

4. 总结

总而言之,Promise是处理异步操作的关键工具,它提供了一种更结构化、更清晰的方式来处理异步任务。通过Promise.race() 可以有效地竞速解决多个异步操作,而 Promise.all() 则可以等待多个异步操作全部完成,从而更高效地处理多个资源的获取和处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷月半明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值