为什么promise.join()将函数作为最后一个参数?

说我在一个需要检索两个对象的过程中有一个步骤。 我将使用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 }); 

我很好奇这个选项存在的理由是什么。

实际时间 :添加的原因是使@spion高兴。 不是没有理由,使用.join意味着你有一个静态的和已知的承诺数量,使得与TypeScript使用它更容易。 佩特卡(Esailija)喜欢这个想法,而且事实上它可以进一步优化,因为它不必遵守其他forms必须遵守的奇怪保证。

随着时间的推移,人们开始(至less我)开始将其用于其他用例 – 即使用承诺作为代理。

那么,让我们来谈谈它做得更好:

静态分析

很难静态分析Promise.all因为它工作在一个未知types的承诺可能不同types的数组上。 Promise.join可以被键入,因为它可以被看作是一个元组 – 所以例如对于3个promise可以给它一个types签名(Promise<S>, Promise<U>, Promise<T>, ((S,U,T) -> Promise<K> | K)) -> Promise<K>这是Promise.alltypes安全的方式。

代理

在代理风格中编写承诺代码时使用它非常干净:

 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 }); 

速度更快

由于它不需要产生caching的给定promise的值,并且保留所有的检查.all(...).spread(...) ,它会执行得稍微快一些。

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

您也可以将处理程序作为最后一个参数。 我很好奇这个选项存在的理由是什么。

这不是一个“选项”。 这是joinfunction的唯一目的。

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

完全等同于

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

但是,正如文件中提到的那样

当你有一个固定数量的离散承诺时,使用起来要简单得多(而且性能更好)

它使您不必使用该数组文本,也不需要为数组结果创build中间承诺对象。