诺兰的承诺/ A + JavaScript难题

Vla*_*rak 8 javascript promise es6-promise

我已经阅读了诺兰劳森几次承诺的问题,但仍然有一些关于JavaScript承诺的问题.在Nolan的帖子结束时,你可以找到四个谜题的答案(我在这里附上了截图).

所以,我有几个问题:

  1. 为什么doSomethingElse()第一个谜题中的功能undefined有价值?在我看来,它必须resultOfDoSomething像第四个谜题一样.

  2. 第3和第4个谜题有什么区别?在then我们写的第一个拼图中doSomethingElse(),在第四个拼图中,我们在这里只写出函数的名称,doSomethingElse.这怎么可能?在第四个难题中真正doSomethingElse做了then什么?

  3. 为什么doSomethingElse()第三个拼图中的功能在同一时刻开始doSomething

拼图1和2 拼图3和4

Why*_*rrh 3

\n
    \n
  1. 为什么doSomethingElse()第一个谜题中的功能[通过] undefined
  2. \n
\n
\n\n

让我们看一个更简单的例子:

\n\n
foo();   // Line #1\nfoo(42); // Line #2\n
Run Code Online (Sandbox Code Playgroud)\n\n

两条线的区别是什么?在第 #1 行,我们调用 foo 但不传递任何值(因此undefined),而在第 #2 行我们调用 foo 并传递 42。

\n\n

回到帖子:

\n\n
doSomething().then(function () {\n    return doSomethingElse( );\n    //                     ^-- we are not passing a value\n}).then(finalHandler);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这与第四个谜题有何不同?在第四个谜题中,我们将对函数的引用传递给then。为 Promise 提供对函数的引用,允许它稍后使用 Promise 的结果调用它。[1]

\n\n
\n\n
\n
    \n
  1. 第三个和第四个谜题有什么区别?在第三个谜题中,我们写 [...] doSomethingElse(),在第四个谜题中,我们写 [...] doSomethingElse
  2. \n
\n
\n\n

为了解释第三个和第四个谜题的差异,让我们看一些更简单的例子。以下两行有何不同:

\n\n
var foo = function foo() {\n    return 42;\n};\nvar a = foo;   // line #1\nvar b = foo(); // line #2\n
Run Code Online (Sandbox Code Playgroud)\n\n

在上面的代码片段中,a将包含对函数的引用foo,而b将包含调用 foo 的结果(这将是 42)。

\n\n
\n\n
\n
    \n
  1. 为什么doSomethingElse()第三个谜题与 同一时刻开始doSomething
  2. \n
\n
\n\n

与第三个和第四个函数之间的差异类似,请注意使用 来()调用或调用)该函数。在这里,我们调用两者doSomething(),而doSomethingElse()不是等待承诺“解决”(等待第一个调用完成)。在之前让我们逐步执行:

\n\n
    \n
  1. 执行doSomething并返回 Promise
  2. \n
  3. 将 附加doSomethingElse()到promise\xe2\x80\x94但是等等,doSomethingElse()我们正在调用doSomethingElse(),所以这将是异步发生的,我们将把它返回的promise附加到返回的promise doSomething()
  4. \n
  5. 将函数附加finalHandler到 Promise 中
  6. \n
\n