我是NodeJS和MySQL数据库的新手,我想为嵌套查询执行我的代码。 场景是我必须得到不完整交易的列表,然后使用迭代循环来迭代我从数据库收到的列表。 在循环中,执行更多查询,并调用第三方API来获取在回调中返回数据的数据。现在的问题是回调是异步执行的,并且循环不会等待回调返回数据并继续运行。 请指导我,因为我陷入了这种情况。
这是我的代码
var sql = incompleteTradesQuery.getIncompleteTrades();
sqlConn.query(sql, function (err, data) {
if (err) {
console.log(err);
}
else {
for (var i = 0; i < data.length; i++) {
bittrexExchange.getOrder(data.order_uuid, function(err, order_data) {
if (order_data.result.IsOpen != true) {
var order_sql = tradesQuery.insertTrade(order_data.result.OrderUuid, order_data.result.Exchange, data.customer_id, order_data.result.Quantity, order_data.result.QuantityRemaining, order_data.result.Limit, order_data.result.Reserved, order_data.result.ReserveRemaining, order_data.result.CommissionReserved, order_data.result.CommissionReserveRemaining, order_data.result.CommissionPaid, order_data.result.Price, order_data.result.PricePerUnit, order_data.result.Opened, order_data.result.Closed, order_data.result.IsOpen, null, data.commission_fee, data.total_transfer, new Date());
sqlConn.query(order_sql);
var incomplete_trades_query = incompleteTradesQuery.deleteIncompleteTradesById(data.id);
sqlConn(incomplete_trades_query);
}
});
}
}
});
答案 0 :(得分:2)
因为NodeJS从根本上说是异步工作,所以嵌套查询也是异步的,编写回调链是一项痛苦的任务。您的问题的一个简单答案是use promises
。
此外,我建议您使用异步方式来处理多个查询,这无疑会比处理查询/请求的同步方式更快地工作。
NodeJS还提供了解决您问题的 async.js 模块。 Q
和Step
也是处理嵌套回调代码的好方法。
https://code.tutsplus.com/tutorials/managing-the-asynchronous-nature-of-nodejs--net-36183