Как использовать вложенные функции, используя async и await? - PullRequest
0 голосов
/ 21 ноября 2018

Я делаю административный скрипт в своем бэкэнде узла, включающем запросы / обновления монго и вызовы API.Я использую async и await, но он не работает так, как я хочу.

(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 голосов
/ 21 ноября 2018

Просто убедитесь, что вы 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...