为什么第一个谜题中的doSomethingElse()
函数值为undefined
?在我看来,它必须像第四个谜题中一样有resultOfDoSomething
。
不是这样的。确实,resultOfDoSomething
被传递给了调用then
的回调函数,但我们在第一个代码中只是忽略了它:
doSomething().then(function(resultOfDoSomething) {
return doSomethingElse( );
});
“第三个谜题”和“第四个谜题”有什么区别?在第三个谜题中,我们首先写下了
doSomethingElse()
,而在第四个谜题中,我们只写了函数名称
doSomethingElse
。这是怎么回事?在第四个谜题的 then 中,
doSomethingElse
到底做了什么?
如你所知,这取决于调用函数和函数本身之间的区别。
此外,我们总是希望 - 不,必须 - 向
then(…)
传递一个回调函数。以下两种方式是等效的:
promise.then(function callback(res) {
…
});
function callback(res) {
…
}
promise.then(callback);
这是预期的 - 你将一个函数传递给调用,所以它像往常一样链接到了 Promise。但是带有调用的 callback()
不再是一个函数:
为什么第三个谜题中的 doSomethingElse()
函数会在同一时刻开始执行,就像 doSomething
一样?
因为它立即在表达式 then(doSomethingElse())
中被调用 - 实际上是在 then
之前调用的,作为它的参数。所以它实际上是在 doSomething()
之后的某个时刻调用的,但在同一个事件循环转中;而这两个异步操作将并行运行。
另外,then
只接受函数参数,其他所有内容都会被忽略。所以这里没有链式调用发生,这与执行以下操作相同:
var promise = doSomething();
doSomethingElse();
promise.then(finalHandler);
不是我们想要的!
顺便提一下,这些也被解释为“高级错误#3:承诺与承诺工厂”和“高级错误#5:承诺失效”,我认为这两个错误都是初学者的错误:-)