简体   繁体   中英

Node.js Promise.all when function returns nothing

How to handle multiple calls to the same function when its returning nothing. I need to wait untill all calls are finished so i can call another function.

For now I'm using Promise.all() but it doesn't seem right:

 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
      }
    });
  });
}

This writes data to a database in multiple statements, i need to wait untill all are finished. Is this actually the "right" way to do it? I mean... it works, but i have the feeling it's not how you are supposed to do it.


Using Promise.all for your case is a good call, since it returns a Promise, when all the promises passed as an iterable are resolved. See the docs .

However, for brevity and readability, try converting your insertValues into async-await function as follows. This tutorial would be a great place to start learning about async functions in 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);
  }
}

Here, insertValues() function doesn't return any value. Its operation on the database is entirely dependent on the query statement passed to it. I wrapped it within a try-catch block so as to catch any errors that might arise while performing the operation (s) above. More details on handling errors using try-catch can be found here .

Your promisified write to database looks ok, so we can update code from another part.
Let's rewrite it a little to use async/await and try/catch .

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

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

I use here IIFE to use await behaviour.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM