蓝鸟两种回归的差异

时间:2017-03-24 18:19:42

标签: javascript node.js promise bluebird

说我有以下node.js代码

function foo() {
    return promiseOne().then(function(result) {
        return promiseTwo();
    });
}

这两个“回归”之间有什么区别?我知道第二个“返回”的目的是使promiseTwo()成为可能。我必须得到第一次“回归”吗?我想这归结为第二次“回归”的范围?因为如果我在某个地方拨打foo()并且我没有第一次'返回',那么我将不会得到任何回报?

4 个答案:

答案 0 :(得分:1)

  

这两个"返回"之间的区别是什么?

第一个返回由.then()函数调用结果调用的promiseOne()方法调用返回的promise。第二个返回promiseTwo()函数调用返回的promise。

  

我必须拥有第一个"返回"?

不,如果您不希望从foo()函数返回承诺,如果您愿意,则回答“是”。

  

因为如果我在某个地方打电话给foo()并且我没有第一次返回'那么我将不会得到任何回报?

任何功能都是如此。如果该功能没有返回任何内容,那么您将无法获得任何回报。无论函数返回什么,它都是正确的 - 承诺或其他任何东西。

如果foo()函数没有返回值,那么您将无法执行以下任何操作:

let promise = foo();
foo().then(...);
foo().catch(...);
let value = await foo();
try { await foo(); } catch (err) { ... }

最后一个只能捕获foo()函数本身抛出的异常,如果你不从foo()函数返回承诺,它就不会捕获承诺拒绝。

答案 1 :(得分:0)

第一个(外部)return可以将foo()本身的结果变成"可以"。

另请注意,函数可以编写如下:

function foo() {
    return promiseOne().then(promiseTwo);
}

因为.then在传递函数引用时会做正确的事 - 原始代码中的匿名包装器是不必要的。

答案 2 :(得分:0)

如果你想链接Promise或只是通过.then()访问其实现的值,你总是必须返回一个Promise。

您想要使用这样的示例:

foo().then((value) => console.log(`My value is ${value}`));

如果您删除了第一个return,则会引发undefined is not a function错误,因为foo()的返回值没有then()函数。

如果删除第二个return,您的脚本将会运行,但valueundefined

仅当您同时拥有return时,value才会返回promiseTwo()的值。

答案 3 :(得分:0)

return之间没有区别,两者都从相应的函数返回。请注意,您的代码中有两个函数,并且都必须返回一个承诺才能按预期工作(以允许其调用者等待结果):

function() {
    return promiseOne().then(…);
}
function(result) {
    return promiseTwo();
}

唯一的区别在于返回的值 - then vs promiseTwo的结果 - 以及调用函数的位置 - 外部通常由用户代码显式调用为{{1} },而内部的一个被称为foo()回调。