为什么节点等待一个单一的承诺,但不是一个承诺的数组?

考虑这个函数嘲笑查询数据库,并在2秒后通过Promise返回一些logging:

function query() { var recs = [1,2,3]; return new Promise(r => setTimeout(() => r(recs), 2000)) } 

如果我添加下面的语句:

 query().then(console.log); 

并用节点运行脚本,暂停2秒,打印出logging,并按预期返回。

另一方面,如果我用一组完全相同的承诺来replace那行:

 Array(5).map(x => query().then(console.log)); 

该脚本立即返回,并且什么都不打印。 为什么节点在退出之前等待单个promise返回,但是当有5个未解决的promise时,立即退出?

这是因为Array(5).map(...将永远不会调用传递给map的函数,原因是map跳过了数组中的数组, Array(5)返回所谓的稀疏数组,并且只有空槽,没有实际的内容。

有关稀疏数组以及如何将它们变成密集数组的更多信息,我将推荐Axel Rauschmayer撰写的这篇优秀的博客文章。