在NodeJS中处理嵌套查询MySQL的回调

时间:2017-10-05 09:24:54

标签: mysql node.js

我是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);
             }
           });
            }
        }
    });

1 个答案:

答案 0 :(得分:2)

因为NodeJS从根本上说是异步工作,所以嵌套查询也是异步的,编写回调链是一项痛苦的任务。您的问题的一个简单答案是use promises

此外,我建议您使用异步方式来处理多个查询,这无疑会比处理查询/请求的同步方式更快地工作。

NodeJS还提供了解决您问题的 async.js 模块。 QStep也是处理嵌套回调代码的好方法。

https://code.tutsplus.com/tutorials/managing-the-asynchronous-nature-of-nodejs--net-36183