什么是javascript承诺的正确术语

awa*_*ken 17 javascript promise

我对被抛出的不同术语感到困惑.根据我的理解,承诺可以是:

fulfilled
rejected
pending 
settled
resolved
defer
Run Code Online (Sandbox Code Playgroud)

解决意味着解决了吗?还是意味着它实现了?什么是推迟的?

Ber*_*rgi 46

术语可能很难.
让我们从Promises/A +规范相应的ES6部分获取3种状态:

  • 等待 - 承诺还没有取得价值,它的未来仍然不确定.
  • 履行 - 承诺成功获得"分配" 的结果值
  • 拒绝 - 承诺给出了无法获得结果的原因,通常是错误.

结算一词是履行和拒绝的超名称,意思是 - 与待决相反.

动态动词实现拒绝描述将状态从挂起改变为已履行或拒绝.这些转变称为履行拒绝承诺.

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

  • 解决具有"普通"价值的承诺意味着实现它
  • 用承诺(或者说)来解决承诺意味着采用其状态:

    • 以履行承诺解决问题是一种满足感
    • 以拒绝的承诺解决是拒绝
    • 以未决承诺解决意味着等待其解决

是的,如果承诺得到解决,甚至可能不知道它是否会被履行或拒绝.但这意味着命运不再是不确定的,因为它与我们解决的承诺有关(注意你只能解决一次承诺).

忽略这种特殊情况,已解决的承诺通常意味着已解决的承诺.

或者,引用ECMAScript 6规范:

如果一个承诺被解决或者它被"锁定"以匹配另一个承诺的状态,则该承诺得到解决.尝试解决或拒绝已解决的承诺无效.如果未解决,承诺得到解决.未解决的承诺始终处于暂挂状态.已解决的承诺可能正在等待,履行或拒绝.


什么是推迟的?

推迟结果意味着您返回结果的(异步)承诺,而不是直接(同步)返回结果.并且还返回延迟拒绝而不是同步投掷.

请注意," defer "也在某些库(Q)中用作构造Deferred对象的方法名称- 请参阅此答案,了解Deferred,Promise和Future之间的差异,以获得更好的解释.
哦,永远不要相信变量名:defer也许是缩写的"deferredObject".

  • 错字:超名词→上位词 (2认同)
  • 视觉是非常有用的,但如果明确"待定"包括"已解决"的部分未包含在"已解决"中,则更为有用.事实上,它给人的印象是"待定"和"已解决"是相互排斥的,与ECMA规范的引用相反. (2认同)

jfr*_*d00 10

承诺/ A +规范的第2.1节列出了三种承诺状态.

从规格:

在此输入图像描述

以下是您询问的每个术语:

待定是最初的承诺状态.承诺所代表的业务尚未被填写或拒绝.

实现是三个承诺国家中的另一个.这意味着承诺已经解决,现在已经解决了价值.承诺所代表的操作已成功完成.

被拒绝是三个承诺状态中的另一个.这意味着承诺已经被拒绝,现在已经被拒绝了.promise所代表的操作无法获取值,因此有理由不这样做(通常是错误代码或错误对象,但它可以是任何东西).

定居是一个术语,意味着承诺要么得到满足要么被拒绝(例如它不再等待),但它不是一个单独的状态,只是一个描述性的术语,表明它不再是待定的.

已解决的术语通常用于表示相同fulfilled,但两者并不完全相同.承诺可以通过一个导致履行的价值来解决,或者可以通过拒绝的承诺来解决(这会导致拒绝承诺),或者可以通过待决承诺解决(这意味着它现在将等待最终的承诺)其他一些承诺的状态).

推迟确切地说出你的意思很难.Promise通常被归类为deferred对象,因为它们是一个对象,代表一个行为和结果,推迟到将来(它将在未来发生).在一些promises实现中,实际上有两种类型的对象,一个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();
 });
Run Code Online (Sandbox Code Playgroud)

ES6承诺示例:

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

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });
Run Code Online (Sandbox Code Playgroud)