Node.js Promise.all, когда функция ничего не возвращает - PullRequest
0 голосов
/ 25 февраля 2019

Как обрабатывать несколько вызовов одной и той же функции, когда она ничего не возвращает.Мне нужно подождать, пока все вызовы не будут завершены, чтобы я мог вызвать другую функцию.

На данный момент я использую Promise.all(), но это не кажется правильным:

 Promise.all(table_statements.map(i => insertValues(i)))
     .then(function(result) {
       readNodeData(session, nodes);
     })
     .catch(function() {
       console.log(err);
     })

function insertValues(statement) {
  return new Promise((res, rej) => {
    database.query(statement, function (err, result) {
      if (err) {
        rej(err)
      }
      else{
       console.log("Daten in Tabelle geschrieben")
       res(); // basically returning nothing
      }
    });
  });
}

Это пишетДанные в базу данных в несколько операторов, мне нужно подождать, пока все не будут закончены.Это действительно «правильный» способ сделать это?Я имею в виду ... это работает, но у меня такое ощущение, что это не то, как ты должен это делать.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Ваша обещанная запись в базу данных выглядит нормально, поэтому мы можем обновить код из другой части.
Давайте немного перепишем его для использования async/await и try/catch.

 (async() => {
   const promisifiedStatements = table_statements.map(i => insertValues(i));

   try {
     await Promise.all(promisifiedStatements);
     readNodeData(session, nodes);
   } catch(e){
     console.log(e)
   }
 })();

Я использую здесь IIFE для использования await поведения.

0 голосов
/ 25 февраля 2019

Использование Promise.all для вашего случая - хороший вызов, так как он возвращает Обещание, когда все обещания, переданные как итеративные, разрешены.См. документы .

Однако для краткости и удобства чтения попробуйте преобразовать insertValues в async-await функцию следующим образом.Этот учебник будет отличным местом для начала изучения асинхронных функций в JavaScript.

// async insertValues function - for re-usability (and perhaps easy unit testing),
// I've passed the database as an argument to the function
async function insertValues(database, statement) {
  try {
    await database.query(statement);
  } catch (error) {
    console.error(error);
  }
}

// using the insertValues() function
async function updateDatabase(database) {
  try {
    // I am using 'await' here to get the resolved value.
    // I'm not sure this is the direction you want to take.
    const results = await Promise.all(
      tableStatements.map(statement => insertValues(database, statement))
    );
    // do stuff with 'results'.. I'm just going to log them to the console
    console.log(results);
  } catch (error) {
    console.error(error);
  }
}

Здесь функция insertValues() не возвращает никакого значения.Его работа с базой данных полностью зависит от оператора запроса, переданного ей.Я обернул его в блок try-catch, чтобы отследить любые ошибки, которые могут возникнуть при выполнении вышеуказанных операций.Подробнее об обработке ошибок с использованием try-catch можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...