我如何履行大量承诺?

时间:2018-12-28 20:58:37

标签: javascript node.js promise es6-promise

我计划在firebase上运行大量查询,这可能会增长到几十万甚至数百万。我一直在使用Promise.all()来解决我的大部分查询,但是随着请求的增长Promise.all()似乎只是停止以随机数运行。我曾考虑使用Promise.map(),但不确定是否并发将解决问题。谢谢您的帮助。

下面是一个简化的示例,您可以看到它似乎超时而不会引发任何错误:

var promises = [];
var i = 0;
for(var x = 0; x<1000000; x++){
 const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    i += 1;
    resolve(i);
  }, 10);
});
  promises.push(promise);
}


Promise.all(promises).then((value) => {
  console.log(value)
}).catch((error) => {
  console.log("Error making js node work:" + error);
})

1 个答案:

答案 0 :(得分:3)

当我需要执行类似操作时,通常将查询分为几批。批处理是一对一运行的,但是每个批处理中的查询是并行运行的。这就是可能的样子。

const _ = require('lodash');

async function runAllQueries(queries) {
  const batches = _.chunk(queries, BATCH_SIZE);
  const results = [];
  while (batches.length) {
    const batch = batches.shift();
    const result = await Promises.all(batch.map(runQuery));
    results.push(result)
  }
  return _.flatten(results);
}

您在此处看到的内容类似于map-reduce。也就是说,如果您在单个节点(例如,单个进程或虚拟机)中运行大量查询,则可以考虑在多个节点之间分布查询。如果查询的数量很大,并且查询的处理顺序并不重要,那么这很容易。您还应该确保下游系统(即您要查询的系统)可以处理您向其施加的负载。