📜  ES6 |承诺(1)

📅  最后修改于: 2023-12-03 14:41:00.651000             🧑  作者: Mango

ES6 | 承诺

ES6(又称ES2015)为JavaScript提供了许多构建大型应用程序和完成复杂任务的新功能。其中,Promises(承诺)是其中一个最受欢迎的新功能之一。Promises是一种用于处理异步操作的设计模式,使JavaScript开发者能够更轻松地编写异步代码。 Promises旨在解决回调地狱(callback hell)的问题,使代码更容易理解和维护。

Promises是什么?

Promise是一个用于异步编程的对象,允许您在异步处理完成后获取处理结果。解决了回调地狱的问题,提供了一种非常好的解决方案,可以轻松地编写更具可读性和易于维护的代码。

Promises解决的核心问题是如何异步化代码。您可以将任何需要等待异步结果的代码打包到Promise中,然后在异步结果准备就绪时通过Promise获得结果。这消除了在代码中编写回调函数的需要,让你的代码更容易阅读和维护。

如何创建Promise

每个Promise创建一个只需要一行的语法,如下所示。

let promise = new Promise(function(resolve, reject) {
  // 异步任务代码
  // 如果成功,调用 resolve(result)
  // 如果失败,调用 reject(error)
});
  • resolvereject是函数,它们是Promise对象的方法。
  • resolve用于处理成功的情况并返回成功的结果。
  • reject用于处理失败的情况并返回错误结果。
Promise的状态

在Promise的生命周期中,它将经历以下任何一个状态:

  • Pending:Promise 处于挂起状态(初始状态),既不成功,也不失败
  • Fulfilled:Promise 成功,调用了resolve的回调方法
  • Rejected:Promise 失败,调用了reject的回调方法

该状态一旦改变就不能再改变了,并且Promise提供了两个方法来检查当前状态。

  • Promise.prototype.then() 用于注册把数据传递给下一个处理程序的成功情况。
  • Promise.prototype.catch() 用于注册处理程序以在发生错误时拒绝情况。
Promise的链式调用

Promise的then()和catch()方法可以对结果进行处理,并且可以链式调用多个方法对Promise的返回结果进行不同的处理,示例如下:

function asyncCall() {
  return new Promise((resolve, reject) => {
      setTimeout(() => {
          resolve('Task Complete!');
      }, 2000);
  });
}

asyncCall()
.then((result) => {
  console.log(result);
  return 'Step 2 Completed!';
}).then((result) => {
  console.log(result);
  return 'Step 3 Completed!';
}).then((result) => {
  console.log(result);
}).catch((error) => {
  console.log(error);
});

在上面的示例中,我们的asyncCall返回的是一个Promise对象。在随后的.then()方法中,我们能够获得异步操作的结果并返回一个值。使用链式调用,我们可以连接.then()方法并顺序执行它们处理函数。

另外,注意到在.catch()方法之后没有使用任何callback函数的代码,这主要是因为Promise已经提供这种错误处理方式,并能使代码更易于阅读与维护。

Promise.all()

Promise.all()方法接受一个可迭代对象(包括Arrays或其他iterables),并且在所有Promises都解决时返回一个新的Promise。如果其中任何一个Promise被拒绝,则返回一个失败的Promise。

使用Promise.all()能使我们同时等待多个Promise,多个异步调用会并行执行,并且不会拖延整体操作的执行时间。示例如下:

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise1');
  }, 2000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise2');
  }, 1000);
});

Promise.all([promise1, promise2])
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.log(error);
  });

在上面的示例中,我们定义了两个不同的Promise,并使用Promise.all()等待它们处理完成。在所有Promise均成功处理完毕后,回调函数将会输出两个Promise的返回值。

结论

Promise是JavaScript异步编程中最常见的技术之一,可以使代码更容易阅读和维护。通过Promise,您可以使用回调地狱以外的更可靠的方法来管理复杂异步程序流程。

以此介绍到此结束,希望这篇文章能够给您学习和使用Promise提供了一些有益的指导。