当函数什么都不返回时的Node.js Promise.all

时间:2019-02-25 08:23:33

标签: node.js asynchronous promise

在不返回任何内容时如何处理对同一函数的多次调用。我需要等到所有调用完成后才能调用另一个函数。

目前我正在使用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 :(得分:1)


在您的案例中使用Promise.all是一个很好的选择,因为当所有作为迭代对象传递的诺言得到解决时,它返回一个Promise。参见docs

但是,为了简便起见,请尝试将insertValues转换为async-await函数,如下所示。 tutorial是开始学习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块中,以捕获执行上述操作时可能出现的任何错误。可以在here中找到有关使用try-catch处理错误的更多详细信息。

答案 1 :(得分:1)

您向数据库承诺的写入看起来不错,因此我们可以从另一部分更新代码。
让我们稍微重写一下,以使用async/awaittry/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的行为。