Promise 是 JavaScript 中处理异步操作的一种方式,它代表了一个异步操作的最终完成或失败,并且可以获取其结果值。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败),一旦状态改变,就会触发相应的回调函数。以下是关于 Promise 的一些重要内容:

1. 创建 Promise:

  • 使用 new Promise() 构造函数创建 Promise 对象,构造函数接收一个执行器函数作为参数,该函数有两个参数:resolvereject,分别用于将 Promise 状态改变为成功和失败。
  • 执行器函数会立即执行,可以进行异步操作,当异步操作完成后调用 resolvereject 函数来改变 Promise 的状态。

2. Promise 状态:

  • pending:初始状态,既不是成功也不是失败状态。
  • fulfilled:操作成功完成。
  • rejected:操作失败。

3. Promise 方法:

  • then():用于注册 Promise 成功状态的回调函数,接收两个参数:成功回调和失败回调。
  • catch():用于注册 Promise 失败状态的回调函数,用于捕获异常。
  • finally():无论 Promise 最终状态如何,都会执行的回调函数。

4. Promise 链式调用:

  • 可以通过链式调用的方式来处理多个异步操作,每个 then() 方法返回一个新的 Promise 对象,从而实现串行执行或并行执行。

5. Promise.all() 和 Promise.race():

  • Promise.all():接收一个 Promise 数组,当所有 Promise 对象都成功时才会成功,返回一个包含所有结果的数组;如果其中一个 Promise 失败,则整个 Promise 失败。
  • Promise.race():接收一个 Promise 数组,当其中一个 Promise 状态发生改变时(无论成功或失败),返回的 Promise 状态就会改变为相应的状态。

示例:

 

// 创建 Promise 对象
let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        let success = true;
        if (success) {
            resolve("Operation completed successfully!");
        } else {
            reject("Operation failed!");
        }
    }, 1000);
});

// 注册成功和失败回调函数
promise.then(
    result => {
        console.log("Success:", result);
    },
    error => {
        console.log("Error:", error);
    }
);

// 使用 Promise 链式调用处理多个异步操作
let asyncTask1 = () => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve("Async Task 1 completed!");
        }, 2000);
    });
};

let asyncTask2 = () => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve("Async Task 2 completed!");
        }, 1000);
    });
};

asyncTask1()
    .then(result => {
        console.log(result);
        return asyncTask2();
    })
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.error(error);
    });

// 使用 Promise.all() 处理多个异步操作
Promise.all([asyncTask1(), asyncTask2()])
    .then(results => {
        console.log("All tasks completed:", results);
    })
    .catch(error => {
        console.error(error);
    });

// 使用 Promise.race() 处理多个异步操作
Promise.race([asyncTask1(), asyncTask2()])
    .then(result => {
        console.log("First task completed:", result);
    })
    .catch(error => {
        console.error(error);
    });