将此视为面试问题。这些承诺会给写作带来什么特殊的后果?其中一些会做同样的事情,但是我需要注意哪些特殊条件?


如果成功,请执行doSomethingElse();,因为内部函数是使用currying完成的,因此可以添加特殊的自定义参数。

doSomething().then(function () {
  return doSomethingElse(a);
});

如果成功:

doSomething().then(function () {
  doSomethingElse(a);
});

doSomethingElse()是回调函数,与4(???)相同

doSomething().then(doSomethingElse());

回调函数doSomethingElse(),与3(?)相同

doSomething().then(doSomethingElse);

最佳答案

1比2

在情况1中-您可以在promise链的下一个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比3

您可以这样重写3:

doSomething().then(function (doSomethingResult) {
  return doSomethingElse(doSomethingResult);
});


因此3接近1,但是在情况3中,我们没有为doSomethingElse提供特殊的自定义参数,而是将doSomething的结果传递给doSomethingElse而不是a

1比4

假设doSomethingElse是至少2个参数的咖喱函数,与1 vs 3相同。

2比3

记住我们可以这样重写3:

doSomething().then(function (doSomethingResult) {
   return doSomethingElse(doSomethingResult);
});


不同之处在于,在第2种情况下,我们没有为doSomethingElse提供特殊的自定义参数(请参见1与3),并且没有将doSomethingElse的结果传递给承诺链中的下一个then(请参见1与2)。

2比4

假设doSomethingElse是至少2个参数的咖喱函数,与2 vs 3相同。

3比4

假设doSomethingElse是至少1个参数的咖喱函数,它们是相同的。
如果doSomethingElse不是咖喱函数,则它们是不同的。

10-04 11:24