JavaScript 使用 Promise

80 阅读2分钟

Promise 对象表示异步操作最终的完成(或失败)以及其结果值。

在现代前端开发中,异步编程是不可或缺的一部分。传统的回调函数(callback)在处理复杂的异步操作时会导致“回调地狱”(callback hell)问题,而 Promise 提供了一种更优雅和可维护的异步处理方式。本文将详细介绍 JavaScript 中的 Promise,帮助你掌握这一重要的异步编程工具。

什么是 Promise

Promise 是 ES6(ECMAScript 2015)引入的一种用于处理异步操作的对象。它代表一个在未来某个时间点可能完成(resolve)或失败(reject)的操作,具有三种状态:

  • Pending(待定) :初始状态,操作尚未完成或失败。
  • Fulfilled(已完成) :操作成功完成。
  • Rejected(已失败) :操作失败。

一旦 Promise 进入 Fulfilled 或 Rejected 状态,就不能再改变。

构建一个 Promise
const myPromise = new Promise((resolve, reject) => {
  // 在这个例子中,我们使用 setTimeout(...) 来模拟异步代码;
  // 在实际情况中,你可能会使用类似 XHR 或 HTML API 等。
  setTimeout(() => {
    // 举例成功
    const success = true;
    if (success) {
      // 当异步操作成功时,我们调用 resolve(...)。
      resolve("成功!"); 
    } else {
      // 当其失败时,调用 reject(...)。
      reject("失败了...");
    }
  }, 300);  
});
使用 then 和 catch

上面创建了一个 myPromise 函数,现在可以使用 then 方法处理它的成功结果,用 catch 方法处理失败结果。

myPromise.then(result => {
    console.log(result); // 输出 "成功!"
}).catch(error => {
    console.error(error); // 如果操作失败,输出 "失败了..."
});
链式调用

每个 .then() 返回一个新生成的 Promise 对象,这个对象可被用于链式调用; 例如:

myPromise.then(result => {
    console.log(result); // 输出 "成功!"
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve("第二次操作成功!"), 2000);
    });
})。then(secondResult => {
    console.log(secondResult); // 两秒后输出 "第二次操作成功!"
}).catch(error => {
    console.error(error); // 如果操作失败,输出 "失败了..."
});

除了 then 和 catch,Promise API 还提供了 Promise.all 和 Promise.race等实用方法。它们应对异步编程各有妙招,能优化流程。想细究用法,可查阅官方手册,虽方法不同,但殊途同归,都助于异步处理。结合 async 和 await 关键字,异步编程变得更加直观和强大。