异步操作和承诺 - 这些编写代码的方式之间有什么区别

时间:2018-01-04 00:55:10

标签: javascript asynchronous promise

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

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

    doSomething().then(function () {
      return doSomethingElse(a);
    });
    
  2. 如果成功:

    doSomething().then(function () {
      doSomethingElse(a);
    });
    
  3. doSomethingElse()是回调函数,与4(???)

    相同
    doSomething().then(doSomethingElse());
    
  4. 回调函数doSomethingElse(),与3(?)

    相同
    doSomething().then(doSomethingElse);
    

2 个答案:

答案 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时,注意,其参数是什么,以及是否将其传递给其他链式承诺

1

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

这将:

  1. 立即致电doSomething()
  2. 等待doSomething()返回的承诺解析。
  3. 使用自定义参数doSomethingElse()调用a,可能来自外部范围。之后链接的任何内容都将获得doSomethingElse(a)的返回值。
  4. 2

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

    这将:

    1. 立即致电doSomething()
    2. 等待doSomething()返回的承诺解析。
    3. 使用自定义参数doSomethingElse()调用a,可能来自外部范围。之后链接的任何内容都会收到 undefined ,而不是doSomethingElse的返回值。
    4. 3

      doSomething().then(doSomethingElse());
      
      1. 立即致电doSomething()
      2. 立即致电doSomethingElse()
      3. 等待doSomething()返回的承诺解析。
      4. 使用一个参数调用步骤2中返回的任何函数doSomethingElse,即doSomething在步骤3中返回的值。此函数的返回值将传递给链接的任何内容。
      5. 4

        doSomething().then(doSomethingElse);
        
        1. 立即致电doSomething()
        2. 等待doSomething()返回的承诺解析。
        3. 调用函数doSomethingElse,非常类似于您的示例#1,除了使用doSomething()的值调用函数而不是您自己的a值。 doSomethingElse的返回值可用于链接。