为什么节点等待单个承诺,而不是一系列承诺?

时间:2016-06-03 03:06:06

标签: javascript node.js promise

考虑这个函数,它模拟查询数据库,并在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的数组时立即退出?

1 个答案:

答案 0 :(得分:1)

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

有关稀疏数组以及如何将它们转换为密集数组的更多信息,我建议由Axel Rauschmayer发布this excellent blog帖子。