Promises 的不同函数调用类型

Different function call types with Promises

它们在

方面有何不同

等等

  getFromURL().then(function () {
      return callbackFunc();
    });
    
    getFromURL().then(function () {
      callbackFunc();
    });
    
    getFromURL().then(callbackFunc());
    
    getFromURL().then(callbackFunc);
getFromURL().then(function () {
  return callbackFunc();
});

此语句 returns 一个 Promise,它将使用 callbackFunc() 返回的值解析(如果 callbackFunc returns 一个 Promise,则跟随任何 Promise 链)。这是一个常见的模式。


getFromURL().then(function () {
  callbackFunc();
});

此语句 returns 一个解析为未定义的 Promise。如果 callbackFunc() 是异步的,则外部 Promise 在 callbackFunc() 完成之前解析。通常这可能是不可取的。


getFromURL().then(callbackFunc());

此语句立即调用​​ callbackFunc(),然后将其 returns 传递给 .then()。结果未定义。没有看到 callbackFunc 就不知道它做了什么。可能会导致错误。


getFromURL().then(callbackFunc);

此语句 returns 一个将使用 callbackFunc() 返回的值解析的 Promise。它与第一个基本相同,完全可以接受。

一般来说,#1 和#4 是您想要使用的。 #2 和#3 不是马虎就是错误。

They are returning same results

这是不正确的。他们并不是都在做同样的事情。

您的选项#1 和#4 是合理的做事方式。您的选项 #2 可能是错误的,特别是如果 callbackFunc() 是异步的。你的选项 #3 总是错误的,除非 callbackFunc() return 是一个你想在承诺链中调用的函数,并且你希望它在 getFromURL() 解析之前被调用(这两种情况都很罕见情况)。

要查看所有这些之间的区别,您需要 callbackFunc() 中的 return 值,并且需要第二个 .then() 以便您可以看到 return 值.

那么,假设 callbackFunc() return 是“你好”。然后,这就是你得到的。这两个是相同的:

getFromURL().then(function () {
  return callbackFunc();
}).then(result => {
  console.log(result);
});

getFromURL().then(callbackFunc).then(result => {
  console.log(result);
});

这两个都将记录调用 callbackFunc() 的 return 值或由 callbackFunc() 编辑的承诺 return 的解析值(以 [=63= 为准) ]s) 或者如果 callbackFunc() returns 是一个被拒绝的承诺,那么承诺链将接受那个拒绝。这两种方案是执行承诺链的正常方法,其中 callbackFunc()getFromURL() 解析后被排序到承诺链中。


这个总是记录 undefined:

getFromURL().then(function () {
  callbackFunc();
}).then(result => {
  console.log(result);
});

因为第一个 .then() 处理程序没有 return 值。 callbackFunc() 的调用顺序与前两个相同,但由于您没有 returning 它是来自 .then() 处理程序的 return 值,因此它是孤立的并与promise 链和 promise 链有一个 undefined 解析值。

如果 callbackFunc() 是异步的,那么这可能是错误的,因为 callbackFunc() 不是承诺链的一部分并且因为你没有 return 它是来自 .then() 处理程序,无法跟踪其成功或失败。这成为一个“即发即忘”的独立承诺链。如果它拒绝,您将收到一个未捕获拒绝的系统错误。

如果 callbackFunc() 是同步的并且您不关心它的 return 值,那么这只是在 getFromURL() 解析之后对 callbackFunc() 排序,就像前两个选项一样,除了你忽略了 return 值。


这个与其他的最不同:

getFromURL().then(callbackFunc()).then(result => {
    console.log(result);
});

它将在 getFromURL() 解析之前调用 callbackFunc()。它的 return 值将传递给 .then()。除非那个 return 值是一个函数引用,否则它会被 promise 链完全忽略。