Javascript:承诺

Javascript:承诺

Javascript Promises

为了理解 javascript 中的 Promise,理解回调函数及其带来的挑战至关重要。您可以从我以前的博客中了解更多信息。

[

Javascript:回调函数

如果您是 javascript 开发人员,那么回调函数是最关键的概念之一。在这篇文章中,我将...

媒体网

](/@ruchivora16/javascript-callback-functions-63533025f32c)

[

Javascript:回调函数的陷阱

Promise 可能是您在学习 javascript 时听说过的东西。一个正在学习的初学者……

媒体网

](/@ruchivora16/javascript-pitfall-of-a-callback-function-255948dde9d4)

为什么我们需要承诺?

回调程序的两个主要缺陷是 回调地狱和控制反转 . Javascript 承诺解决控制反转问题 . Promise 提供了知道任务何时完成的能力,然后将控制权交还给程序/代码以决定下一步该做什么。与回调相反,其中将控制权交给另一方(第三方 API/代码)。

什么是承诺?
想象一下这样的场景:我走到一家快餐店的柜台前,点了一份意大利面 arrabbiata。我支付了金额,作为回报,收银员返回给我一张收据,上面有提到的订单号。这张收据只不过是一张保证我最终(将来)会收到我的意大利面的承诺书。 或者 即使出现问题,说餐厅没有 arrabbiata 酱,那么至少我可以要求退款并想办法吃别的东西。
通过这个类比,我们可以看到未来价值观的一个重要特征:它们可以表示成功或失败。 所以 **** 每次我点意大利面时,我都知道我要么会得到意大利面,要么会收到悲伤的消息。

这个类比不太准确,javascript 承诺比这更复杂。但没关系,开始......

承诺的语法是:

 让 promise = new Promise( (resolve,reject) => {  
 // 需要一些时间才能执行的代码。例如:做意大利面的时间  
 })

传递给的函数 新的承诺 有两个由javascript提供的回调函数resolve()和reject()。当 promise 中的代码被执行时,它应该调用以下回调函数之一:
- resolve(value):如果代码执行成功,则返回一个值。例如:从我们的类比来看,如果我们成功地收到了意大利面。
-reject(error):如果代码执行失败,则返回错误。例如:根据我们的类比,如果我们收到坏消息,因为餐厅缺少 arrabbiata 酱汁。

新的 Promise 构造函数 返回一个承诺对象 它具有以下属性:
- state:最初,promise 在 待办的 状态 ,那么它可以在 完成 状态 当 resolve() 被调用或者它可以在 被拒绝 状态 如果拒绝()被调用。
- 结果:最初是 不明确的 ,当 resolve(value) 被调用时,它包含 价值 或者它包含一个 错误 如果拒绝(错误)返回。

Promises in javascript

以我们的类比为例,看看代码是如何执行的。

Promise in pending state and result is undefined

在上面的代码示例中,传递给新 Promise 构造函数的函数有两个回调函数(resolve、reject)。代码在五秒后执行,并根据条件,解决或拒绝返回值或错误的承诺。当代码执行暂停五秒钟时,promise 处于 待办的 状态结果 不明确的。

五秒钟后 承诺的状态从待定更改为已完成结果的值从未定义更改为已解决 价值 (即你的意大利面准备好了!!)

Promise in fulfilled state and result changes from undefined to resolved value

如果 arrabbiata 酱不可用,则 Promise 处于拒绝状态,结果为 reject() 值(即抱歉,我们不能为您提供意大利面)

Promise in rejected state and result changes from undefined to rejected value

then()、catch() 和 finally() 方法

因此,promise 可以处于以下状态之一,即挂起、已完成和已拒绝状态。当承诺被履行或处于拒绝状态时,它被称为 承诺已成定局 .

当 Promise 处于已完成状态时,您可以在 Promise 的 then() 方法中访问已解析的数据。

当 Promise 处于被拒绝状态时,您可以在 Promise 的 catch() 方法中访问错误信息。

finally() 方法在所有情况下都会执行,无论 promise 是被实现还是被拒绝。

基本上,根据承诺的状态,可以决定进一步的行动。继续我们对意大利面的类比,考虑下面的代码。

The Promise is fulfilled and .then() method is executed

在示例中,当我们收到意大利面时(promise 处于已完成状态),然后执行 then() 中的代码并 点一杯可乐 被打印。此外,finally() 中的代码被执行,并且 我可以安然入睡 被打印。

The Promise is rejected and .catch() method is executed

在示例中,我们需要订购一个三明治(promise 处于拒绝状态),因此 catch() 中的代码被执行并 订购三明治 被打印。此外,无论 promise 的状态如何,finally 中的代码总是被执行。

在下一篇博客中,我会写一些关于 Promise 链和微任务队列的文章,这将帮助你理解 async 和 await 关键字的重要性……。

如果您有任何疑问或建议,请随时在下面发表评论......

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/2970/49283108

posted @ 2022-08-31 08:50  哈哈哈来了啊啊啊  阅读(43)  评论(0编辑  收藏  举报