我试图在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。
答案 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 。
如果所有这些都有意义,那么下一步就是决定是否:
您使用Promise Chaining实现了第一名,如TLP的答案所示。您只需删除代码中的“返回”即可实现#2,即:
for(var i=0; i < productIds.length; i++) {
queryObject.get(productIds[i]).then(//handle result)
}