承诺决定"帮助"根据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 ;
如果这有一个简单明确的答案(当然可能允许实施之间的变化空间), 紧接着的后续问题是:
答案 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"?感兴趣。