【问题标题】:Why does promise.join() take a function as its last parameter?为什么 promise.join() 将函数作为其最后一个参数?
【发布时间】:2015-06-19 01:27:03
【问题描述】:

假设我在需要检索两个对象的过程中有一个步骤。我会使用join() 来协调检索:

return promise.join(retrieveA(), retrieveB())
           .spread(function(A, B) {
               // create something out of A and B
           });

文档显示您也可以将处理程序作为最后一个参数传递:

return promise.join(retrieveA(), retrieveB(), function(A, B) {
           // create something out of A and B
       });

我很好奇这个选项的存在背后的基本原理。

【问题讨论】:

标签: javascript node.js promise bluebird


【解决方案1】:

事实时间:添加.join 的原因是为了让@spion 开心。不过,并非没有理由,使用 .join 意味着您拥有 静态且已知 数量的 promise,这使得在 TypeScript 中使用它变得更加容易。 Petka (Esailija) 喜欢这个想法,也喜欢它可以进一步优化的事实,因为它不必遵守其他形式必须遵守的奇怪保证。

随着时间的推移,人们开始(至少是我)将它用于其他用例——即使用 Promise 作为代理。

那么,让我们谈谈它做得更好的地方:

静态分析

很难静态分析Promise.all,因为它适用于具有可能不同类型的未知类型承诺的数组。 Promise.join 可以输入,因为它可以被看作是一个元组 - 例如,对于 3 个 promise 的情况,您可以给它一个类型签名 (Promise<S>, Promise<U>, Promise<T>, ((S,U,T) -> Promise<K> | K)) -> Promise<K> ,这对于 @987654327 来说根本无法以类型安全的方式完成@。

代理

在编写代理风格的 Promise 代码时使用起来非常干净:

var user = getUser();
var comments = user.then(getComments);
var related = Promise.join(user, comments, getRelated);
Promise.join(user, comments, related, (user, comments, related) => {
     // use all 3 here
});

更快

因为它不需要缓存给定 promise 的值并保留 .all(...).spread(...) 所做的所有检查 - 它的执行速度会稍微快一些。

但是……你真的通常不应该在意。

【讨论】:

  • 感谢您的详细回答。样式代理中的使用很有意义。
  • all(…).spread(…) 需要哪些检查而 join(…) 不需要?两次Array.isArray(…)?
  • 它也创造了另一个承诺
【解决方案2】:

您也可以将处理程序作为最后一个参数传递。我很好奇这个选项的存在背后的基本原理。

这不是一个“选项”。这是join 函数的唯一用途。

Promise.join(promiseA, promiseB, …, function(a, b, …) { … })

完全等价于

Promise.all([promiseA, promiseB, …]).spread(function(a, b, …) { … })

但是,正如documentation 中提到的,它

当您有固定数量的离散承诺时,使用起来更容易(并且性能更高)

它使您无需使用该数组字面量,并且不需要为数组结果创建该中间承诺对象。

【讨论】:

  • Promise.join(promiseA, promiseB, promiseC)... 工作的原因也是因为它在 1.x 中就是这样,并且为了向后兼容而保留
  • 但我既没有调用 all() 也没有使用数组字面量。
  • @cleong 您正在使用仅由于向后兼容而弃用的联接版本,新代码应仅使用新版本
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多