承诺决议如何决定是将回报值视为承诺还是作为普通价值?

时间:2016-03-30 14:59:40

标签: javascript promise es6-promise

承诺决定"帮助"根据resolve()的返回值或传递给then()的函数的返回值是否为promise,做不同的事情。

因此,理解和预测行为需要准确了解正在使用(或被允许使用)的标准,以确定某些事物是否是一种承诺"因为我使用上面这句话中的短语,所以我想指出这一点。我一般对Promises / A +感兴趣,特别是ES6原生承诺。

期待https://promisesaplus.com/,它说:

1.1 "promise" is an object or function with a "then" method
    whose behavior conforms to this specification.

要了解这意味着什么,我会进一步研究2.2"那么方法",并发现它依赖于一组 行为标准使得显然无法在算法上决定是否给定对象 是否是承诺(通过暂停问题证明)。这没关系;它只是意味着规范 "乐于助人"有问题的行为不会使用术语"是一个承诺"直接

因此,进一步寻找"有用的规范"行为,我发现2.3"承诺解决程序"。 惊喜!它 使用术语"是一个承诺"直接:

2.3.2 If x is a promise, adopt its state [3.4]

但它在脚注中将自己从堕落变为无意义:

[3.4] Generally, it will only be known that x is a true promise
      if it comes from the current implementation. This clause allows
      the use of implementation-specific means to adopt the state of
      known-conformant promises.

换句话说,2.3.2并不真正意味着"如果x是一个承诺",它真的意味着(并且应该说,IMO)"如果x是已知承诺"。

但是,如果我理解正确的话,那部分只是它可以证明它可以安全的快捷方式。 继续,相关部分似乎是2.3.3,我总结为:将返回值x视为承诺 iff x有一个名为"然后"这是一个功能。

那么这一切都取决于" x的定义。然后是一个函数"。 对于想要实现一致的库的人来说,这意味着什么呢? 或者有人想要在我使用它时预测一致的库必须/可能做什么? 是否与说typeof x.then === "function"

相同

希望获得更多线索,我研究了一个符合要求的实现(或一组实现)的规范,ES6原生承诺, 它与MDN上的Promises文档相关联。 我相信相关部分是25.4.1.3.2。 看起来有问题的标准是IsCallable(x.then);按照链接, 我沮丧的是,IsCallable不是一个实际的功能,而是一个"抽象操作", 根据许多其他"抽象运算来定义"这远非简单。

此时,我希望看到任何符合相关决定的符合性参考代码似乎正在迅速消退: - (

支持我原来的问题"承诺决议如何决定是否将返回值视为承诺?", 我正在思考正如我上面所解释的那样,我把它归结为一个更具体的问题:Promises / A +规范究竟是什么意思,当它说'#34;是一个功能&#34 ;

如果这有一个简单明确的答案(当然可能允许实施之间的变化空间), 紧接着的后续问题是:

  • 原生承诺是否符合简单明确的答案?
  • 为什么本土承诺'承诺的实施/ A +""是一个功能"这么复杂吗?
  • 对我来说,合理的方法是确保将我的回报价值视为我想要的承诺, 或者作为我想要的普通价值?

1 个答案:

答案 0 :(得分:1)

  

那么这一切都取决于“x.then is a function”的定义。这是什么意思,是否与说x.then === "function"的类型相同?

是的,正是如此。除非访问x.then,否则您需要将所有这些内容包含在try块中。

  

为什么原生承诺'承诺/ A +'的实现“功能”如此复杂?

因为它是规范术语。 "function"基本上被定义为“可调用对象”,isCallable只是测试它的算法。它基本上与typeof operator用于确定是否返回字符串"function"的算法相同。

顺便说一下,你会对Regarding Promises/A+ Specification, what is the difference between the terms "thenable" and "promise"?感兴趣。