【问题标题】:JavaScript ES6 promisesJavaScript ES6 承诺
【发布时间】:2018-03-31 20:28:48
【问题描述】:

问题:这四个 promise 有什么区别?

doSomething().then(function () { return doSomethingElse(); });

doSomething().then(function () { doSomethingElse(); });

doSomething().then(doSomethingElse());

doSomething().then(doSomethingElse);

【问题讨论】:

  • 取决于doSomethingElse() 返回的内容。你觉得有什么区别?
  • 你也应该考虑doSomething().then(function(value) { return doSomethingElse(value); })(提示,提示:相当于最后一种情况)

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

选项 1:

doSomething().then(function () { return doSomethingElse(); });

这会执行doSomething(),然后当它解析时,它会执行doSomethingElse(),promise链的解析值就是doSomethingElse()的解析值或返回值。没有参数传递给doSomethingElse()

如果你要总结这个选项,你会说它是:

按顺序链接,不传递参数。


选项 2:

doSomething().then(function () { doSomethingElse(); });

与选项 1 相同,除了 promise 链的解析值是 undefined,因为 .then() 处理程序没有返回值。来自doSomethingElse() 的任何返回值,无论是承诺还是值都会被忽略。

如果你要总结这个选项,你会说它是:

按顺序执行(未链接),不传递参数。


选项 3:

doSomething().then(doSomethingElse());

这几乎不是你想要的。这将执行doSomething(),然后在doSomething() 解析之前,它还执行doSomethingElse() 并将doSomethingElse() 的返回值作为.then() 处理程序传递。这是一个编码错误,除非doSomethingElse() 返回一个用作.then() 处理程序的函数。

如果你要总结这个选项,你会说它是:

立即执行,可能是一个错误


选项 4:

doSomething().then(doSomethingElse);

这与选项 1 相同,只是将来自 doSomething() 的解析值作为第一个参数传递给 doSomethingElse(val)。这在结构上与此相同:

doSomething().then(function(result) { return doSomethingElse(result)});

如果你要总结这个选项,你会说它是:

按顺序链接,带参数传递。


其他说明:

  1. 如果doSomethingElse() 返回一个承诺,那么只有选项 1 和 4 会将该承诺添加到链中(因为它们是唯一从 .then() 处理程序返回承诺的选项),因此链将等待为了解决这个承诺。

  2. 在选项 1、2 和 4 中,如果 doSomethingElse() 抛出同步异常,则 Promise 链将以异常为原因被拒绝。在选项 3 中,函数在 Promise 链之外执行,因此如果它抛出一个同步异常,它将抛出一个更高的范围(类似于 if doSomething() throw synchronously)。

【讨论】:

    【解决方案2】:

    在第一种情况下,在解决 doSomething() 返回的承诺后,回调被调用。回调函数可以返回另一个 Promise(这就是我们称 Promise 为“可链式”的原因)。在您的情况下,doSomethingElse() 预计会返回另一个承诺。

    在第二种情况下,回调函数不返回任何内容,因此将调用执行链中的下一个promise,但参数未定义。

    在第三种情况下,回调函数作为doSomethingElse()函数的结果提供。

    最后,doSomethingElse 应该是一个函数,它将在完成第一个承诺后执行。

    【讨论】:

    • 下一个promise会被触发,他们只会在那里收到undefined(在第二种情况下),例如this jsfiddle
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2016-11-11
    • 2014-12-27
    • 2016-11-20
    • 2018-11-28
    • 2016-06-13
    相关资源
    最近更新 更多