为什么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.all
types安全的方式。
代理
在代理风格中编写承诺代码时使用它非常干净:
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(...)
,它会执行得稍微快一些。
但是…你通常不应该在意。
您也可以将处理程序作为最后一个参数。 我很好奇这个选项存在的理由是什么。
这不是一个“选项”。 这是join
function的唯一目的。
Promise.join(promiseA, promiseB, …, function(a, b, …) { … })
完全等同于
Promise.all([promiseA, promiseB, …]).spread(function(a, b, …) { … })
但是,正如文件中提到的那样
当你有一个固定数量的离散承诺时,使用起来要简单得多(而且性能更好)
它使您不必使用该数组文本,也不需要为数组结果创build中间承诺对象。