javascript Promise的正确术语是什么

IT技术 javascript promise
2021-01-24 21:45:42

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

fulfilled
rejected
pending 
settled
resolved
defer

解决就意味着解决吗?或者这是否意味着它实现了?什么是延迟?

3个回答

术语可能很难。
让我们从Promises/A+ 规范相应的 ES6 部分中得知有3 种状态

  • 待定- Promise还没有取值,它的未来仍然不确定。
  • 履行- Promise成功获得“分配”结果值
  • 拒绝- 给Promise一个无法获得结果原因,通常是一个错误。

解决一词是已完成和已拒绝的上位,意思是两者之一 - 与未决相反。

动态动词fulfillreject描述将状态从pending 更改为fulfilled 或rejected。这些转换称为Promise的履行拒绝

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

  • 用“普通”值解决Promise意味着实现它
  • 使用Promise(或 thenable)解决Promise意味着采用其状态:

    • 以兑现的Promise解决是一种兑现
    • 解决一个被拒绝的Promise是一个拒绝
    • 使用挂起的Promise解决意味着等待其解决

是的,如果一个Promise得到解决,它甚至可能不知道它是否会被实现或被拒绝。但这意味着命运不再是不确定的,因为它与我们解决的Promise绑定在一起(请注意,您只能解决一次Promise)。

忽略这种特殊情况,已解决的Promise通常意味着已解决的Promise。

或者,引用ECMAScript 6 规范

如果一个Promise被解决或者它被“锁定”以匹配另一个Promise的状态,那么它就会被解决。尝试解决或拒绝已解决的Promise没有效果。如果一个 promise没有解决,它就是未解决的。未解决的Promise始终处于挂起状态。已解决的Promise可能是未决的、已完成的或被拒绝的。


什么是延迟?

推迟结果意味着您返回结果的(异步)Promise,而不是直接(同步)返回结果。并且还返回延迟拒绝而不是同步抛出

请注意,在某些库 ( Q ) 中,“ defer ”也用作构造对象的方法名称- 请参阅有关Deferred、Promise 和 Future 之间的差异的答案以获得很好的解释。 哦,永远不要相信变量名:也可能是一个缩写的“deferredObject”。Deferred
defer

视觉效果非常有用,但如果明确说明“待定”包括“已解决”中未包含在“已解决”中的部分,则效果会更好。事实上,它给人的印象是“待定”和“已解决”是相互排斥的,这与 ECMA 规范中的引用相反。
2021-03-13 21:45:42
又称“在旷野讲道”。
2021-03-17 21:45:42
可能令人困惑的是,在大多数情况下,“解决”仅意味着“实现或匹配另一个Promise的状态”。例如,对于不可实现的值,Promise.resolve(..)或者new Promise((resolve, _) => {resolve(..)})只创建一个已实现的Promise,但从不创建一个被拒绝的Promise。但是,对于不可Promise的不常见情况,它可以拒绝或履行(即和解)。因此,“解决或匹配另一个Promise的状态”实际上是正确的。
2021-03-17 21:45:42
那个视觉效果的A+
2021-03-18 21:45:42
错别字:上位词 → 上位词
2021-03-30 21:45:42

Promises/A+ 规范的第 2.1 节列出了三个 Promise 状态

从规范:

在此处输入图片说明

所以这里是您询问的每个术语:

Pending是初始的 promise 状态。由Promise表示的操作尚未完成或拒绝。

达到的是另一个三个诺状态。这意味着Promise已经被解决,现在有它的解决value。Promise所代表的操作已经成功完成。

拒绝是三个Promise状态中的另一个。这意味着Promise已被拒绝,现在有被拒绝的原因。由 promise 表示的操作未能获取值,因此有失败的原因(通常是错误代码或错误对象,但可以是任何内容)。

Settled是一个术语,表示Promise要么被履行,要么被拒绝(例如,它不再是挂起的),但它不是一个单独的状态,只是一个描述性的术语,表明它不再是挂起的。

Resolved是一个经常用来表示与 相同的术语fulfilled,但两者并不完全相同。一个Promise可以用一个导致履行的值来解决,也可以用一个被拒绝的Promise来解决(这会导致这个Promise被拒绝),或者它可以用一个挂起的Promise来解决(这意味着它现在将等待最终的其他一些Promise的状态)。

很难准确说出您所说的defer是什么意思Promises 通常被归类为deferred对象,因为它们是表示延迟到未来(它会在未来发生)的操作和结果的对象。在一些 promise 的实现中,实际上有两种类型的对象,一个deferred对象和一个promise对象。延迟对象是Promise对象的超集。两者都可以观察.then()处理程序何时解决或拒绝操作但是,只有deferred对象才能真正将状态更改为resolvedrejected

在 jQuery 中,您可以使用$.Deferred(). 在其他实现中,例如 ES6 Promise,您只有Promise对象,其构造函数回调具有rejectresolve函数。世界大概正在朝着 ES6 的方向发展。

使用deferred对象的jQuery 示例

function delay(t) {
    var defer = $.Deferred();
    setTimeout(function() {
        defer.resolve();
    }, t);
    return defer.promise()
 }

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });

ES6 Promise示例:

 function delay(t) {
     return new Promise(function(resolve, reject) {
         setTimeout(function() {
             resolve();
         }, t);
     });
 }

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });
@Bergi - 好的,我清理了一些对术语的描述。
2021-03-19 21:45:42
@jfriend00:请参阅我的回答以澄清解决和实现之间的区别。不过,您的描述不够准确,无法投票:-)
2021-03-26 21:45:42
@MillieSmith - 是的,尽管我喜欢并使用 MDN 作为有用的资源,但这次似乎有错误的Promise状态,所以我认为直接进入规范是明智的。
2021-03-30 21:45:42
当您引用规范时,他们不喜欢它。/秒
2021-04-08 21:45:42

多梅尼克·丹尼科拉 (Domenic Denicola) 的“国家与命运”( States and Fates ) 是一个很好的、精辟的总结。

状态:

  • 如果将“尽快”调用 f,Promise已实现promise.then(f)
  • 如果将“尽快”调用 r,Promise将被拒绝promise.then(undefined, r)
  • 如果一个 promise既没有被实现也没有被拒绝,那么它就是待定的

命运:

  • Promise被解决,如果试图解决或拒绝它没有任何效果,即Promise已被“锁定在”要么跟着另一个Promise,或已履行或拒绝
  • 如果一个Promise没有解决,那么它就是未解决的,也就是说,如果试图解决或拒绝它会对Promise产生影响。

点击链接了解“相关状态和命运”的详细信息。