"决心"是否始终意味着与"履行"不同的东西?

Lar*_*rsH 6 javascript terminology es6-promise

(相关但不完全相同:JS Promises:Fulfill vs Resolve)

我一直在尝试围绕Javascript承诺,我正在努力解决解决的基本概念,而不是履行实现.我已经阅读了几个介绍,例如Jake Archibald,以及浏览一些 相关的 规范.

国家和命运(不是官方规范,但引用作为规范作者之一的权威文件),履行是一个国家,而解决是一个"命运"(无论是什么 - 但他们明显不同) :

承诺有三种可能的互斥状态:履行,拒绝和待决.

  • 如果能尽快给f打电话,我们就会履行承诺promise.then(f).

如果试图解决拒绝承诺,则承诺得到解决,即承诺已被"锁定"以遵循另一承诺,或已履行拒绝

特别是,已解决包括已履行和已拒绝(并已锁定).拒绝的"相反"(或直接相应的功能)是满足,而不是解决 ; 解决 包括 拒绝作为其可能性之一.

然而,规范引用了then()使用完成解析的方法(或其相应的抽象概念)的第一个参数:

  • 25.4:如果p.then(f,r)将立即将Job排入队列以调用函数f,则履行了 p .

  • 25.4.1.1:[[ 解决 ]]甲功能对象时使用所述的功能解决给定的允诺对象.

  • 25.4.1.3:设置[无极]的内部插槽决心承诺.将resolve的[[AlreadyResolved]]内部插槽设置为alreadyResolved.[然后立即以完全相应的方式使用拒绝.]

  • 25.4.5.3:Promise.prototype.then(onFulfilled,onRejected)

也许其中最重要的是

  • 25.4.4.5承诺.解决(x)

MDN描述如下:

所述Promise.resolve(值)方法返回与给定的值解析的无极对象.如果该值是一个可设置的(即具有"then"方法),则返回的promise将"跟随"那个可能的,采用其最终状态; 否则返回的承诺将通过该值来实现.

没有提到Promise.resolve()具有拒绝潜力的方法.此外,有一种Promise.reject()方法,但没有Promise.fulfill()方法.所以在这里,拒绝的对手是解决,而不是履行.

当然,在解决的"命运"一词与方法(或动词)解决之间可能没有保证相关性.但是,当满足解决的条款被认真地定义为具有不同的含义时,resolve()将这个承诺带入一个特定的履行状态会是(真的吗?)真的是误导和混淆.

这就是在这里发生的事情......右手不知道左手在做什么,我们最终得到的文件应该是以不一致的方式使用术语的运动的指路灯?或者是否有一些我缺少的东西,而解决方案实际上是一个更合适的术语,而不是满足resolve()方法的作用?

我并不是说要批评文档作者.我理解,对于广泛分布的群体而言,历史上很难让所有文件在所有文档中得到一致使用.我在这里挖掘这些文件的术语和措辞的目的是准确理解这些术语 - 其中包括了解如何真正区分完成解决等术语的限度.杰克阿奇博尔德承认,他有时会把条款搞砸了.对于像我这样试图理解术语的新手来说,这是一个非常有用的录取!杰克,谢谢你的弱势.:-)我提出这个问题的目的是要找出这些术语的哪些定义或用法可靠的?或者,我是否应该得出结论,即使在最权威的文档,有时也会特别使用解决方案来表示实现,有时候实现/拒绝/锁定

Kai*_*ido 1

让我们在您的引言中的其他地方强调一下:

如果尝试解决或拒绝一个承诺没有效果,则该承诺已解决,即该承诺已被“锁定”以遵循另一个承诺,或者已被履行或拒绝

reject()会将您的 Promise 和所有先前链接的 Promise 状态更改为rejected
虽然resolve()会锁定您当前的 Promise,但只有解决回调的完成才会将其状态设置为fulfilled。只要一切还没有结束,你的承诺就依然存在'pending'

例如,如果您确实链接了 Promise,并且在链接过程中抛出了错误,则 Promise 的状态将设置为'rejected'

var p = new Promise((resolve, reject) => {
  resolve(); // here p is resolved, we can't call resolve() or reject() anymore
}).then((e) => { // chain it
  return new Promise((resolve, reject) => {
    console.log(p); // 'pending' because it's still chained
    reject('whatever') // this one throws an error and breaks the chain
  })
}).then(() => console.log('passed')); // won't happen


setTimeout(() => console.log(p, "please check in your browser's console"), 1000); // rejected
Run Code Online (Sandbox Code Playgroud)

因此,即使您正在resolve()执行 Promise 的当前操作,您也无法知道之后会发生什么,因此您无法知道最后是否会是fulfilledrejected