为什么节点等待一个单一的承诺,但不是一个承诺的数组?
考虑这个函数嘲笑查询数据库,并在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撰写的这篇优秀的博客文章。