javascript 承诺的正确术语是什么

2024-01-06

我对周围的不同术语感到困惑。根据我的理解,承诺可以是:

  • 实现了
  • rejected
  • pending
  • settled
  • resolved
  • defer

解决了就是解决了吗?还是说已经实现了呢?延迟到底是什么?


术语可能很难。
让我们从承诺/A+规范 https://promisesaplus.com/#promise-states相应的 ES6 部分 https://262.ecma-international.org/6.0/#sec-promise-objects3 states:

  • pending- 承诺尚未取值,其结果仍不确定。
  • 实现了- 承诺成功得到了结果值“已分配”
  • rejected- 承诺被赋予reason为什么无法获得结果,通常是一个错误。

期限settled是已完成和已拒绝的同义词,意思是任一 - 与待处理相反。

动态动词fulfill and reject描述将状态从待处理更改为已完成或已拒绝。这些转变被称为履行 or 拒绝的承诺。

这些都很容易。现在,resolve是一个不同的野兽。它有时被用作“履行”的同义词,但最好将其理解为将承诺的命运确定为履行或拒绝。这解决(很少:结算)承诺意味着它离开待处理状态。但即使这样也是不准确的 - 问题在于递归本质承诺解决程序:

  • 用“简单”值解决承诺意味着履行它

  • 用 Promise(或 thenable)解决 Promise 意味着采用它的状态:

    • 兑现承诺来解决就是一种兑现
    • 解决被拒绝的承诺就是拒绝
    • 解决待处理的承诺意味着等待其解决

是的,如果承诺得到解决,甚至可能不知道它是会被履行还是会被拒绝。但这也意味着命运不再是未定的,因为它与我们解决的承诺绑定在一起 - 请注意,您只能解决承诺一次,它不能解决为不同的值(通过调用resolve/reject again).

忽略这个特殊情况,resolved承诺通常意味着确定的承诺。

或者,引用ECMAScript 6 规范 https://262.ecma-international.org/6.0/#sec-promise-objects:

一个承诺是解决是否已解决或是否已“锁定”以匹配另一个承诺的状态。尝试解决或拒绝已解决的承诺没有任何效果。一个承诺是未解决的如果没有解决。未解决的 Promise 始终处于待处理状态。已解决的承诺可能悬而未决、履行或拒绝。


defer 到底是什么?

推迟结果意味着您返回结果的(异步)承诺,而不是直接(同步)返回结果。并且还返回延迟拒绝而不是同步抛出 https://stackoverflow.com/q/21887856/1048572.

请注意“defer" 也在一些库中使用(Q https://github.com/kriskowal/q/wiki/API-Reference#qdefer) 作为方法名来构造Deferred对象-见这个答案关于Deferred、Promise 和 Future 之间的区别 https://stackoverflow.com/a/18858041/1048572以获得一个很好的解释。
哦,永远不要相信变量名称:defer也可能是缩写的“deferredObject”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript 承诺的正确术语是什么 的相关文章

随机推荐