将此视为面试问题。以这些方式写承诺的特殊后果是什么?其中一些会做同样的事情,但我需要注意的特殊条件是什么?
如果成功,请执行doSomethingElse();
,因为内部函数是通过currying完成的,您可以添加特殊的自定义参数。
doSomething().then(function () {
return doSomethingElse(a);
});
如果成功:
doSomething().then(function () {
doSomethingElse(a);
});
doSomethingElse()
是回调函数,与4(???)
doSomething().then(doSomethingElse());
回调函数doSomethingElse()
,与3(?)
doSomething().then(doSomethingElse);
答案 0 :(得分:2)
1 vs 2
如果 1 - 您可以在保证链的下一个doSomethingElse(a)
中获得then
的结果。
像这样:
doSomething().then(function () {
return doSomethingElse(a);
}).then(function (doSomethingElseWithAResult /* <-- here */) {
// Some code
});
如果 2 - 您的承诺链中的下一个undefined
始终会获得then
:
doSomething().then(function () {
return doSomethingElse(a);
}).then(function (alwaysUndefined /* <-- here */) {
// Some code
});
1 vs 3
您可以像这样重写 3 :
doSomething().then(function (doSomethingResult) {
return doSomethingElse(doSomethingResult);
});
所以 3 接近 1 ,但如果 3 ,我们不会向doSomethingElse
我们提供特殊的自定义参数将doSomething
的结果传递给doSomethingElse
而不是a
。
1 vs 4
与 1 vs 3 相同,假设doSomethingElse
是一个咖喱函数,至少有2个参数。
2 vs 3
记住我们可以像这样重写 3 :
doSomething().then(function (doSomethingResult) {
return doSomethingElse(doSomethingResult);
});
不同之处在于,如果 2 我们没有向doSomethingElse
提供特殊的自定义参数(请参阅 1 vs 3 ),我们不会通过doSomethingElse
到我们的保证链中的下一个then
的结果(请参阅 1 vs 2 )。
2 vs 4
与 2 vs 3 相同,假设doSomethingElse
是一个咖喱函数,至少有2个参数。
3 vs 4
它们是相同的,假设doSomethingElse
是至少1个参数的curried函数。
如果doSomethingElse
不是一个咖喱函数,它们就不一样了。
答案 1 :(得分:1)
在调用doSomethingElse
时,注意,其参数是什么,以及是否将其传递给其他链式承诺。
doSomething().then(function () {
return doSomethingElse(a);
});
这将:
doSomething()
。doSomething()
返回的承诺解析。doSomethingElse()
调用a
,可能来自外部范围。之后链接的任何内容都将获得doSomethingElse(a)
的返回值。doSomething().then(function () {
doSomethingElse(a);
});
这将:
doSomething()
。doSomething()
返回的承诺解析。doSomethingElse()
调用a
,可能来自外部范围。之后链接的任何内容都会收到 undefined
,而不是doSomethingElse
的返回值。doSomething().then(doSomethingElse());
doSomething()
。doSomethingElse()
。doSomething()
返回的承诺解析。doSomethingElse
,即doSomething
在步骤3中返回的值。此函数的返回值将传递给链接的任何内容。doSomething().then(doSomethingElse);
doSomething()
。doSomething()
返回的承诺解析。doSomethingElse
,非常类似于您的示例#1,除了使用doSomething()
的值调用函数而不是您自己的a
值。 doSomethingElse
的返回值可用于链接。