承诺在2015年发行ES6时得到了广泛的支持和普及在JavaScript中。尽管事实上,丹尼尔·弗里德曼(Daniel P.异步操作的最终完成或失败。本文将分解这一切的含义。
先决条件ð
- JavaScript的工作知识
- 代码编辑器(我建议视觉工作室代码)
让我们开始吧
诺言的三个状态
承诺根据正在执行的操作而有三个不同的状态,
- 未决:该操作尚未完成
- 实现的:操作已成功完成,返回的对象已准备就绪
- 拒绝:操作失败
很酷,很有意义。现在,代码中的外观如何?
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。