在节点js中的for循环内一个接一个地执行mysql查询

Execute mysql query one after the other inside for loop in node js

我正在尝试在 for 循环中一个接一个地执行 Mysql 查询。我想要实现的是每次迭代都将使用前一次迭代查询生成的输出,但发生的情况是由于 I/O 在 javascript 中的异步性质,所有查询都试图执行所有立即给出错误,因为未使用上一个查询的结果。

我的 synatx 与此类似:-

var query = "some sql query";
for(i=0;i<10;i++) {
    result = sqlQuery(query);
    // resultToQuery perform some operation on result and return a query
    query = resultToQuery(result);
}

处理这个问题的最简单方法是使用 async / await。请注意,await 语法允许您以易于阅读的形式在序列中使用异步方法代码。另请注意,您可以等待 returns 承诺的函数,也可以等待异步函数。它们实际上是相同的东西,只是语法略有不同。

像这样。

 /* promisified query method, suitable for await */
 function doQuery(conn,sql,args) {
     return new Promise (function( resolve, reject ) {
        conn.query(sql, args, function (error, results, fields) {
            if (error) return reject(error)
            resolve({results, fields})
        }) 
     })
 }

 /* your loop operation */
 async function whatever ( args ) {
      for (whatever conditions) {
         let queryOutput = await doQuery (conn, sql, [arg, arg])
         let firstColumn = queryOutput.results['first_column']
      }
      return resultValue
 }

 /* call your async function */
 whatever(args)
 .next (function (resultValue) {  whatever you need } )
 .catch (console.error)

你可以像这样使用 forEach 循环

array.forEach(async item=>{
  await conn.query(sql, args)
  //write query with await
}