在节点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
}
我正在尝试在 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
}