考虑这个函数,它模拟查询数据库,并在2秒后通过Promise返回一些记录:
function query() {
var recs = [1,2,3];
return new Promise(r => setTimeout(() => r(recs), 2000))
}
如果我添加以下声明:
query().then(console.log);
并使用节点运行脚本,它会暂停2秒,打印出记录,然后按预期返回。
另一方面,如果我用完全相同的承诺数组替换该行:
Array(5).map(x => query().then(console.log));
脚本立即返回,并且不打印任何内容。为什么节点在退出之前等待单个promise返回,但是当有5个未解析的promise的数组时立即退出?
答案 0 :(得分:1)
这是因为Array(5).map(...
永远不会调用传递给map的函数。原因是地图跳过了数组中的漏洞。 Array(5)
返回所谓的稀疏数组,并且只有空插槽但没有实际内容。
有关稀疏数组以及如何将它们转换为密集数组的更多信息,我建议由Axel Rauschmayer发布this excellent blog帖子。