Promise详解及面试例题

1、Promise的基本概念

1.1、基本概念:

  1. PromiseJavaScript中的一种用于处理异步操作的对象
  2. 可以把它想象成一个“承诺”——程序承诺会在未来的某个时间点完成某件事(比如从服务器获取数据),但是,并不立即返回结果。

1.2、Promise的状态:

Promise 有三种状态:

  1. Pending(进行中): 承诺还没有完成,也没有失败,它正在等待某件事情发生。
  2. Fulfilled(已完成): 承诺成功地完成了,并且返回了一个结果。
  3. Rejected(已失败) : 承诺未能完成,发生了某种错误或问题。

1.3、生活场景示例:

假设小明让小红帮忙买咖啡,小红答应了,这时,这个“答应”的过程就是一个Promise,它可能有三种状态:

  • Pending:小红还在咖啡店排队,咖啡还没买到手。
  • Fulfilled:小红已经买到咖啡,并且把咖啡给了小明。
  • Rejected:小红因为某种原因没法买到咖啡,告诉小明:“抱歉,没买到”。

2、Promise的链式调用规则

Promise的链式调用是指:

  1. 在一个Promise.then() 方法中返回一个新的Promise,然后可以继续在这个新的Promise上调用.then() 方法
  2. 这种方式可以:让我们可以把多个异步操作串联起来,依次处理,避免回调地狱。
  1. .then()返回的是一个新的Promise
    • 每次调用.then() 方法后,你都会得到一个新的Promise
    • 这使得你可以在下一个.then()里继续处理上一个.then()的结果。
  2. .then() 的回调函数可以返回值:
    • 如果回调函数返回的是一个普通的值(而不是 Promise),这个值会被包装成一个已经完成的 Promise,并传递给下一个 .then()
  3. 回调函数返回的是Promise
    • 如果回调函数返回的是一个Promise,那么下一个.then()将会等待这个Promise完成,然后继续处理结果。
  4. 错误传递:
    • 如果任何一个.then()中发生错误(包括抛出异常或返回一个被拒绝的 Promise),这个错误会被传递到后面最近的.catch()中处理。

3、Promise的静态方法

  1. Promise.resolve(value):
    • 用来快速创建一个已经完成的Promise,并将给定的value作为结果。
    • 适用于:将一个普通的值或非Promise的结果转换为Promise
  2. Promise.reject(reason):
    • 用来快速创建一个被拒绝的Promise,并将给定的 reason 作为错误原因。
    • 适用于:将一个错误或失败的结果转换为 Promise
  3. Promise.all(iterable):
    • 接受一个可迭代对象(通常是一个数组)作为参数,其中每个元素都是一个 Promise。
    • 只有当所有的 Promise 都完成时,返回的 Promise 才会被完成,结果是一个包含所有结果的数组
    • 如果有任何一个Promise被拒绝,Promise.all会立即返回一个被拒绝的Promise
  4. Promise.race(iterable):
    • 接受一个可迭代对象,其中每个元素也是一个 Promise。
    • 返回的 Promise 会在第一个 Promise 完成或拒绝时,采用这个 Promise 的结果或错误。
    • 适用于:你只关心最先完成的异步操作的场景
  5. Promise.allSettled(iterable):
    • 接受一个可迭代对象,每个元素是一个 Promise。
    • 返回的 Promise 会等待所有的 Promise 都结束(无论是完成还是拒绝),并返回一个数组,数组中的每一项都是一个对象,表示每个 Promise 的状态和结果。
    • 适用于:你希望等待所有 Promise 结束后,处理每个 Promise 的结果
  6. Promise.any(iterable):
    • 接受一个可迭代对象,每个元素是一个 Promise。
    • 返回的 Promise 会在第一个成功(fulfilled)的 Promise 完成时被完成。如果所有的 Promise 都被拒绝,返回的 Promise 会被拒绝,错误信息是所有错误的一个数组。
    • 适用于:你只关心最先成功的异步操作的场景

4、async和await

  • asyncawaitJavaScript中用于处理异步操作的关键字
  • 它们让你能够像写同步代码那样编写异步代码
### JavaScriptPromise 的详细解释与使用方法 #### 一、Promise 基本概念 Promise 是一种用于管理异步操作的解决方案,它提供了更清晰和可控的方式处理异步流程。简单来说,Promise 是一个容器,用来保存异步操作的结果[^3]。 Promise 对象具有三种状态: - **Pending(初始状态)**: 表示异步操作尚未完成。 - **Fulfilled(已完成状态)**: 表示异步操作成功完成。 - **Rejected(已拒绝状态)**: 表示异步操作失败并抛出了错误[^4]。 一旦 Promise 状态从 Pending 转变为 Fulfilled 或 Rejected,则其状态不可再更改。 --- #### 二、Promise 构造函数及其基本用法 Promise 使用 `new` 关键字实例化,并传入一个执行器函数作为参数。该执行器函数会立即自动调用,接受两个参数:`resolve` 和 `reject` 函数。这两个函数分别用于表示异步操作的成功或失败。 以下是创建 Promise 并使用 `.then()` 方法的例子: ```javascript const myPromise = new Promise((resolve, reject) => { const isSuccess = true; if (isSuccess) { resolve('操作成功'); // 成功时调用 resolve } else { reject('操作失败'); // 失败时调用 reject } }); myPromise.then( (value) => { console.log(value); }, // 当 Promise 履行时触发此回调 (error) => { console.error(error); } // 当 Promise 拒绝时触发此回调 ); ``` 上述代码展示了如何通过 `resolve` 和 `reject` 来控制 Promise 的状态变化。 --- #### 三、链式调用与返回值 `.then()` 方法可以返回新的 Promise 实例,从而支持链式调用。每次调用 `.then()` 都能基于前一步的操作结果继续执行逻辑[^2]。 下面是一个简单的例子展示链式调用的功能: ```javascript function addOne(num) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(num + 1); }, 1000); }); } addOne(5).then(result => { console.log(`第一次加一: ${result}`); // 输出 6 return result * 2; // 返回新值给下一个 then() }).then(newResult => { console.log(`乘以两倍: ${newResult}`); // 输出 12 }); ``` 在这个例子中,第一个 `.then()` 接收上一步的结果 (`6`) 并将其传递到下一步进行进一步计算。 --- #### 四、Promise.all() 方法 当需要等待多个 Promise 同时完成后才执行后续逻辑时,可使用 `Promise.all()` 方法。这个方法接收一个包含多个 Promise 的数组作为参数,并返回一个新的 Promise 实例[^1]。 如果所有的输入 Promise 都被履行,那么 `Promise.all()` 将返回这些 Promise 结果组成的数组;如果有任何一个 Promise 被拒绝,则整个过程会被中断并直接进入拒绝状态。 以下是一段演示代码: ```javascript const promise1 = Promise.resolve(1); const promise2 = new Promise(resolve => setTimeout(() => resolve(2), 100)); const promise3 = 3; Promise.all([promise1, promise2, promise3]).then(values => { console.log(values); // 输出 [1, 2, 3] }); ``` 这里需要注意的是,只有所有子 Promise 完成后才会触发最终的 `.then()` 回调。 --- #### 五、常见错误处理方式 为了捕获可能发生的异常情况,在实际开发过程中通常会在最后附加一个 `.catch()` 方法来统一处理错误信息。 例如: ```javascript new Promise((resolve, reject) => { throw new Error('测试错误'); }) .catch(err => { console.error('捕捉到错误:', err.message); // 输出 测试错误 }); ``` 这种方式能够有效简化多层嵌套 try-catch 的复杂度,使程序更加简洁易读。 --- ### 总结 Promise 提供了一个优雅的方式来解决传统回调地狱问题,使得异步代码更容易理解和维护。无论是单独使用还是与其他工具组合应用,掌握好它的核心原理对于现代前端工程师而言都是至关重要的技能之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值