在函数中循环处理查询

时间:2018-08-07 02:32:23

标签: javascript node.js asynchronous

我的问题是以下帖子的扩展: Handle queries inside loop in node.js

var output;
for (var j = 0; j < someArr.length; j++) {
  tVal = someArr[i]; //some manipulation of someArr[i]
  (function(val) {
    connection.query("select id from someTable where someCol = ?", val, function(err, rows, fields) {
      if (err) {
        console.log(err);
      } else {
        output.push(rows[0].someVal); //push query output to this variable
      }
    });
  })(tVal);
}

现在,我想将整个代码放入一个函数中并返回输出。但是,当我尝试它返回一个空集。

1 个答案:

答案 0 :(得分:1)

您应该将每个query变成一个Promise,然后将Promise.all返回到Promises数组上。无需进行丑陋的for循环闭合,只需使用.map即可:

function getAllQueries(someArr) {
  const allPromises = someArr.map(val => new Promise((resolve, reject) => {
    connection.query( "select id from someTable where someCol = ?",val, function(err, rows, fields) {
      if (err) return reject(err);
      else resolve(rows[0].someVal);
    });
  }));
  return Promise.all(allPromises);
}

使用.then来使用它:

getAllQueries(['foo', 'bar'])
  .then((responses) => {
    console.log(responses);
  });