等待promise for循环
let currentProduct;for (let i = 0; i < products.length; i++) {
currentProduct = products[i];
subscription.getAll(products[i]._id)
.then((subs) => {
update(subs, currentProduct);
});
}
我正在使用bluebird,方法 和 return
promises。我如何说“等到两个承诺返回,然后更新currentProduct值”?我对JS很陌生…
回答:
如果可以使用async
/,这将很简单await
。
// Make sure that this code is inside a function declared using// the `async` keyword.
let currentProduct;
for (let i = 0; i < products.length; i++) {
currentProduct = products[i];
// By using await, the code will halt here until
// the promise resolves, then it will go to the
// next iteration...
await subscription.getAll(products[i]._id)
.then((subs) => {
// Make sure to return your promise here...
return update(subs, currentProduct);
});
// You could also avoid the .then by using two awaits:
/*
const subs = await subscription.getAll(products[i]._id);
await update(subs, currentProduct);
*/
}
或者,如果您只能使用简单的承诺,则可以遍历所有产品,并将每个承诺置于.then
最后一个循环中。这样,仅当前一个问题解决时,它才会前进到下一个问题(即使它将首先迭代整个循环):
let currentProduct;let promiseChain = Promise.resolve();
for (let i = 0; i < products.length; i++) {
currentProduct = products[i];
// Note that there is a scoping issue here, since
// none of the .then code runs till the loop completes,
// you need to pass the current value of `currentProduct`
// into the chain manually, to avoid having its value
// changed before the .then code accesses it.
const makeNextPromise = (currentProduct) => () => {
// Make sure to return your promise here.
return subscription.getAll(products[i]._id)
.then((subs) => {
// Make sure to return your promise here.
return update(subs, currentProduct);
});
}
// Note that we pass the value of `currentProduct` into the
// function to avoid it changing as the loop iterates.
promiseChain = promiseChain.then(makeNextPromise(currentProduct))
}
在第二个代码段中,循环仅建立了整个链,但没有.then
立即执行内部代码。您的getAll
功能要等到之前的每个功能依次解决后才能运行。
以上是 等待promise for循环 的全部内容, 来源链接: utcz.com/qa/413223.html