📜  JavaScript Promise 完整参考(1)

📅  最后修改于: 2023-12-03 15:31:38.209000             🧑  作者: Mango

JavaScript Promise 完整参考

什么是Promise

Promise是ES6中新增的异步编程解决方案,它是对异步操作的状态和结果进行抽象和封装,让异步操作更加容易和直观。Promise可以用来代替回调函数,让我们的代码更加详尽,易于维护。

Promise的基本使用

Promise有三种状态,分别是 pending(等待中)、fulfilled(已完成)和rejected(已失败)。当Promise状态变为fulfilledrejected时,就称为Promise被解决了(Promise settled)。

创建一个Promise对象可以使用Promise构造函数,语法如下:

const promise = new Promise((resolve, reject) => {
  // 异步操作代码
});

Promise构造函数的参数是一个函数,这个函数接受两个参数resolvereject。当异步操作完成时,调用resolve函数将Promise的状态变为fulfilled;当异步操作失败时,调用reject函数将Promise的状态变为rejected

接下来,我们可以给Promise对象加上相应的方法来处理异步操作的结果:

promise.then(onFulfilled, onRejected)

then方法接受两个参数,分别是Promise解决时的回调函数onFulfilled和Promise拒绝时的回调函数onRejected,这两个函数都是可选的。

Promise的常用方法
Promise.resolve

Promise.resolve方法返回一个以给定值解决的Promise对象。如果传入的是一个thenable对象或者Promise对象,则直接返回该对象。如果传入的是一个错误对象,则返回的Promise对象的状态为rejected。如果没有传入参数,则返回一个状态为fulfilled的Promise对象。

Promise.resolve(value)
Promise.reject

Promise.reject方法返回一个被拒绝的Promise对象,其reason值为传递的参数。

Promise.reject(reason)
Promise.all

Promise.all方法是将多个Promise对象包装成一个Promise对象,并等所有Promise解决后才进行后续处理。

Promise.all([promise1, promise2, ...])
Promise.race

Promise.race方法是将多个Promise对象包装成一个Promise对象,并只等最先解决的Promise对象,忽略解决的先后顺序。

Promise.race([promise1, promise2, ...])
Promise的常见问题
如何解决Promise地狱?

Promise地狱是指过多的嵌套Promise对象导致代码难以阅读和维护。为了解决Promise地狱,我们可以使用async/await语法糖。

async function fetchData() {
  const data1 = await asyncFunc1(params1);
  const data2 = await asyncFunc2(params2);
  const data3 = await asyncFunc3(params3);
  return { data1, data2, data3 };
}

使用async/await语法糖可以使我们的代码更加直观清晰。同时,使用Promise.all也可以使嵌套的Promise对象更清晰。

async function fetchData() {
  const [data1, data2, data3] = await Promise.all([asyncFunc1(params1), asyncFunc2(params2), asyncFunc3(params3)])
  return { data1, data2, data3 };
}
如何处理Promise中的错误?

在Promise链中,如果有一个Promise对象被拒绝(rejected),那么整个链都会停止执行,并且直接跳到最后的catch方法。可以在catch方法中统一处理Promise链中的错误,也可以在每个Promise中使用try-catch来处理错误。

async function fetchData() {
  try {
    const data1 = await asyncFunc1(params1);
    const data2 = await asyncFunc2(params2);
    const data3 = await asyncFunc3(params3);
    return { data1, data2, data3 };
  } catch (error) {
    console.error(error)
  }
}
结语

Promise是异步编程中必不可少的一部分,它让我们的异步操作更容易理解和维护。对于想要学习使用Promise的程序员而言,扎实的基础和丰富的练习是不可或缺的。