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
,您的脚本将 运行,但您的 value
是 undefined
。
只有当您同时拥有两个 return
时,value
才是 promiseTwo()
的 returned 值。
return
之间没有区别,都是 return 来自各自的功能。请注意,您的代码中有两个函数,它们都必须 return 承诺按预期工作(以允许调用者等待结果):
function() {
return promiseOne().then(…);
}
function(result) {
return promiseTwo();
}
唯一的区别在于 returned 值 - then
与 promiseTwo
的结果 - 以及调用函数的位置 - 外部通常由显式调用用户代码为 foo()
,而内部代码称为 then
回调。
假设我有以下 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
,您的脚本将 运行,但您的 value
是 undefined
。
只有当您同时拥有两个 return
时,value
才是 promiseTwo()
的 returned 值。
return
之间没有区别,都是 return 来自各自的功能。请注意,您的代码中有两个函数,它们都必须 return 承诺按预期工作(以允许调用者等待结果):
function() {
return promiseOne().then(…);
}
function(result) {
return promiseTwo();
}
唯一的区别在于 returned 值 - then
与 promiseTwo
的结果 - 以及调用函数的位置 - 外部通常由显式调用用户代码为 foo()
,而内部代码称为 then
回调。