在JavaScript中分解承诺
#javascript #网络开发人员 #教程 #promises

承诺在2015年发行ES6时得到了广泛的支持和普及在JavaScript中。尽管事实上,丹尼尔·弗里德曼(Daniel P.异步操作的最终完成或失败。本文将分解这一切的含义。

先决条件ð

  1. JavaScript的工作知识
  2. 代码编辑器(我建议视觉工作室代码)

让我们开始吧

诺言的三个状态

承诺根据正在执行的操作而有三个不同的状态,

  1. 未决:该操作尚未完成
  2. 实现的:操作已成功完成,返回的对象已准备就绪
  3. 拒绝:操作失败

很酷,很有意义。现在,代码中的外观如何?

const myPromise = new Promise((resolve, reject) => {
  //async operation

  if (success) {
    resolve("the operation has completed successfully!");
  } else {
    reject('"the operation has failed"); 
  }
});

Promise构造函数带有一个参数,即回调函数。回调函数采用两个参数,分别是解决和拒绝函数。在执行异步操作时,承诺处于待处理状态。承诺的操作完成后,可以调用分辨率函数以表明操作成功,如果拒绝功能失败了。然后可以使用呼叫承诺构造函数返回的承诺对象进行链接。

链接承诺和消费者

您可以使用.then().catch().finally()等消费者来链接承诺。让我们遍历每个吧

.then()继续执行代码,并在解决或拒绝承诺时被调用。它涉及两个参数:拒绝案件的验证诺言和回调功能的回调功能。

.catch()被拒绝时被调用。当执行过程中发生某些错误时,也会调用它。被对待类似于.. then(),但它并没有提出何时实现诺言的论点。

.finally()在承诺解决时被调用,无论成功或失败如何。这个消费者没有任何争论。

让我们看看它们如何通过制作卡布奇诺咖啡。

function boilWater() { 
  return new Promise((resolve, reject) => { 
    setTimeout(() => {
      resolve("water has boiled.");
    }, 2000);
  });
} 

function brewCoffee(water) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("coffee has been brewed.");
    }, 2000);
  });
}

function frothMilk() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Milk has been frothed.");
      resolve();
    }, 2000);
  });
}

boilWater()
  .then((water) => {
    return brewCoffee(water);
  })
  .then(() => {
    return frothMilk();
  })
  .then(() => {
    console.log("Enjoy your cappuccino");
    return;
  })
  .catch((error) => {
    console.log(error);
  })
  .finally(() => {
    console.log("Continue coding!")
  });

在上面的示例中,boilWater首先称为,它返回已解决的承诺,该承诺被链接到brewCoffee函数。链条继续进行,一旦frothMilk返回了解决的诺言,enjoy your cappuccino将被记录。如果拒绝任何承诺或执行中发生任何其他错误,则捕获量将记录错误。无论成功或失败如何,finally消费者都会被称为。这是我每天早上都有的例程:)

下一步

您可以看到,承诺可能会导致许多链接和嵌套功能,从而导致代码中的可读性受苦。随着异步/等待,其中很多将变得更简单。您可以阅读here