说我有以下node.js代码
function foo() {
return promiseOne().then(function(result) {
return promiseTwo();
});
}
这两个“回归”之间有什么区别?我知道第二个“返回”的目的是使promiseTwo()成为可能。我必须得到第一次“回归”吗?我想这归结为第二次“回归”的范围?因为如果我在某个地方拨打foo()
并且我没有第一次'返回',那么我将不会得到任何回报?
答案 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
,您的脚本将会运行,但value
为undefined
。
仅当您同时拥有return
时,value
才会返回promiseTwo()
的值。
答案 3 :(得分:0)
return
之间没有区别,两者都从相应的函数返回。请注意,您的代码中有两个函数,并且都必须返回一个承诺才能按预期工作(以允许其调用者等待结果):
function() {
return promiseOne().then(…);
}
function(result) {
return promiseTwo();
}
唯一的区别在于返回的值 - then
vs promiseTwo
的结果 - 以及调用函数的位置 - 外部通常由用户代码显式调用为{{1} },而内部的一个被称为foo()
回调。