MST

星途 面试题库

面试题:JavaScript 异步编程之 Promise

请解释一下 Promise 的状态以及如何在 JavaScript 中使用 Promise 处理异步操作。假设有两个异步任务,第二个任务依赖第一个任务的结果,用 Promise 实现该场景。
18.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

Promise 的状态

  1. Pending(进行中):初始状态,既不是成功,也不是失败状态。
  2. Fulfilled(已成功):意味着操作成功完成,此时会有一个 resolved 的值。
  3. Rejected(已失败):意味着操作失败,此时会有一个 rejection 的原因。

在 JavaScript 中使用 Promise 处理异步操作

  1. 创建 Promise:通过 new Promise((resolve, reject) => { /* 异步操作 */ }) 语法创建一个 Promise 实例。在执行器函数中,进行异步操作,如果操作成功,调用 resolve 并传入结果;如果操作失败,调用 reject 并传入错误信息。
  2. 处理 Promise:使用 .then() 方法处理成功的情况,.catch() 方法处理失败的情况。.then() 方法接受一个回调函数,该函数的参数是 Promise 成功时 resolve 的值;.catch() 方法接受一个回调函数,该函数的参数是 Promise 失败时 reject 的值。

用 Promise 实现两个异步任务,第二个任务依赖第一个任务的结果

// 模拟第一个异步任务
function asyncTask1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const result = 42; // 模拟成功结果
            resolve(result);
        }, 1000);
    });
}

// 模拟第二个异步任务,依赖第一个任务的结果
function asyncTask2(result1) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const newResult = result1 * 2; // 基于第一个任务结果进行操作
            resolve(newResult);
        }, 1000);
    });
}

asyncTask1()
   .then(result1 => {
        return asyncTask2(result1);
    })
   .then(finalResult => {
        console.log('最终结果:', finalResult);
    })
   .catch(error => {
        console.error('发生错误:', error);
    });

在上述代码中:

  1. asyncTask1 模拟了第一个异步任务,在 1 秒后 resolve 出一个结果。
  2. asyncTask2 模拟了第二个异步任务,依赖 asyncTask1 的结果,在 1 秒后 resolve 出基于第一个任务结果计算后的新结果。
  3. 通过链式调用 .then() 方法,先执行 asyncTask1,然后将 asyncTask1 的结果传入 asyncTask2 并执行,最后处理最终结果。如果任何一个 Promise 被 reject.catch() 方法会捕获错误并处理。