bluebird中两种Return的区别

Difference of Two Types of Return in bluebird

假设我有以下 node.js 代码

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

这两个 "return" 有什么区别?我知道 2nd "return" 的目的是使 promiseTwo() 可用。我必须要第一个 "return" 吗?我想这归结为第二 "return" 的范围?因为如果我在某处调用 foo() 而我没有第一个 'return',那么我将不会得到任何回复?

What's the difference between these two "return"s?

第一个 return 是 return 由 .then() 方法调用编辑的承诺,在 promiseOne() 函数调用的结果上调用。第二个 return 是 return 由 promiseTwo() 函数调用编辑的承诺。

Do I have to have the 1st "return"?

如果您不想从 foo() 函数 return 编辑 promise,则否;如果您这样做,则否。

Because if I call foo() somewhere and I don't have 1st 'return', then I will not get anything back?

任何函数都是如此。如果该函数没有 return 任何东西,那么您将不会得到任何回报。无论函数 returns 是什么 - 承诺或其他任何东西都是如此。

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

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

最后一个只会捕获 foo() 函数本身抛出的异常,如果您不 return 来自 foo() 的承诺,它不会捕获承诺拒绝功能。

第一个(外部)return 是为了将 foo() 本身的结果变成 "thenable"。

另请注意,函数可以这样写:

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

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

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

您想像这样使用您的示例:

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

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

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

只有当您同时拥有两个 return 时,value 才是 promiseTwo() 的 returned 值。

return 之间没有区别,都是 return 来自各自的功能。请注意,您的代码中有两个函数,它们都必须 return 承诺按预期工作(以允许调用者等待结果):

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

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