用JS中的Promise循环

时间:2018-09-27 16:31:22

标签: javascript promise async-await parse-server

我试图在nodejs的for循环内运行查询,并且for循环的每次迭代都运行一个查询。查询是使用“ get()”方法完成的,该方法返回Promise。在我的函数(包含此for循环)中,我将返回get()方法返回的promise,如下所示:

for(var i=0; i < productIds.length; i++) { return queryObject.get(productIds[i]).then(//handle result) }

,但是这将在第一次迭代后返回,并且在其余的迭代中不会继续。我该如何解决这个问题?

对于上下文,我正在使用Parse的Cloud Functions。

3 个答案:

答案 0 :(得分:2)

两种可能性,并行和串行。我将同时显示:

async function serial(productIds) {
  for(const productId of productIds) {
      await queryObject.get(productId).then(//handle result)
  }
}

function parallel(productIds) {
  return Promise.all(
     productIds.map( productI => queryObject.get(productId).then(//handle result)
  );
}

答案 1 :(得分:1)

您必须像这样建立一个承诺链:

let chain = Promise.resolve();

for (i=0; i<1000; i++) {
   chain = chain.then(()=>queryObject.get(objectId))
}

chain.then(()=>{ /* do something once all queries have returned a result */})

答案 2 :(得分:1)

TLP给出的答案显示为Promise Chaining,将在这里为您服务。但是,我将解释发生的事情,并提供替代答案。

首先,让我们了解为什么您的代码无法执行所需的操作:

for(var i=0; i < productIds.length; i++) {
    return queryObject.get(productIds[i]).then(//handle result)
}

您希望代码针对每个productId运行;但是,您是在第一次迭代中告诉代码返回,退出for循环。考虑以下几点:

for(var i=0; i < productIds.length; i++) {
    return productIds[i];
}

从图片中删除promise使查看错误更加容易。此for循环等效于:

return productIds[0];

同样,您的代码等效于:

return queryObject.get(productIds[0]).then(//handle result)

假设您在这里看到错误,现在我将指出您在思考过程中遇到的一个小错误。在您的帖子中,您说:

  

我正在返回get()方法返回的承诺,如下所示:

您指的是从对get()方法的“ the”调用返回的一个promise,但是您实际上希望多次调用get()方法,从而产生许多 promise

如果所有这些都有意义,那么下一步就是决定是否:

  1. 您需要在完成所有承诺(使用检索到的数据的完整列表)之后运行代码。
  2. 您只需要为每个已完成的承诺运行代码(仅使用从特定承诺中获取的数据)。

您使用Promise Chaining实现了第一名,如TLP的答案所示。您只需删除代码中的“返回”即可实现#2,即:

for(var i=0; i < productIds.length; i++) {
    queryObject.get(productIds[i]).then(//handle result)
}