如何通过异步和等待使用嵌套函数?

时间:2018-11-21 20:16:12

标签: javascript node.js asynchronous promise

我正在节点后端执行管理脚本,其中包括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个元素。

1 个答案:

答案 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));