我正在节点后端执行管理脚本,其中包括mongo查询/更新和api调用。我正在使用async并等待,但它并不能按我的要求工作。
(async () => {
// connect to mongo (works ok)
const products = await getProducts(); // Here I have my 10 elements
await Promise.all(products.map(async (prod) => {
response = await getProductInfo(prod.id);
})); // here I call to getProductInfo ten times.
})()
.catch(err => console.error(err));
const getProductInfo = async(idProduct) => {
const response = await rq(optionsProductInfo); //request to API
await Product.updateOne({ sku: response.sku }, { $set: {
priority: response.priority,
price: response.price,
} }); // update product info
};
问题在于数据库中的更新未执行10次。有时执行2、3、4次,但从不执行10个元素。
答案 0 :(得分:0)
只要确保您await
正在做正确的事情,并且任何具有等待功能的函数本身就是async
,那么您就可以了。例如,以下代码可以正常工作。
const products = [1,2,3,4,5,6];
async function updateRecord(data) {
return new Promise((resolve, reject) => {
// using timeout for demonstration purposes
setTimeout(async() => {
console.log("pretending I updated", data.id);
resolve();
}, 1000 * Math.random());
});
};
async function getProductInfo(id) {
return new Promise((resolve, reject) => {
// again using timeout for demonstration purposes
setTimeout(async() => {
console.log("fake-retrieved product info for", id);
resolve(await updateRecord({ id }));
}, 1000 * Math.random());
});
};
Promise.all(products.map(pid => getProductInfo(pid)))
.then(() => console.log("we're done."));
.catch(e => console.error("what?", e));