javascript - Node.js 处理异步

标签 javascript mysql json node.js asynchronous

我正在尝试了解 Node.js 的异步性质。 我有一条快速路线,我知道该路线不会提供我需要的数据。本质上,第一个 mysql 查询按预期 100% 工作,并且 res.json 中返回的 json 数据是正确的。然而,在第一个 mysql 函数中,我调用另一个函数“getOrderLines()”,它总是返回“{"Item":[]}”,而不是我期望的数据。

我知道发生这种情况是因为 Node 的异步性质,但是我似乎无法解决这个问题,我研究了 promise 并编写了一些基本 promise ,但无法让它在下面工作。

如有任何帮助,我们将不胜感激。

router.route('/salesOrders')
    .get(function (req, res) {
            mysql.query("QUERY", function (err, sql1) {
                    for (i = 0; i < sql1.length; i++) {
                        json.Company.SalesOrders.SalesOrder[i] = {
                            "Id": sql1[i].Id,
                            "AccountReference": sql1[i].AccountReference,
                            "SalesOrderDate": sql1[i].SalesOrderDate,
                            "SalesOrderAddress": [{
                                "Forename": sql1[i].billFirstname,
                                "Lastname": sql1[i].billLastName,
                                "Address": sql1[i].billAddress1
                            }],
                            "SalesOrderItems": {}
                        };
                        json.Company.SalesOrders.SalesOrder[i].SalesOrderItems = getOrderLines(sql1[i].Id);
                    } // End first For loop.
                    res.json(json);
                };
            };
            getOrderLines = function (orderId) {
                var orderLineJson = {
                    "Item": []
                };
                mysql.query('QUERY', function (err, sql2) {
                    for (j = 0; j < sql2.length; j++) {
                        orderLineJson.Item[j] = {
                            "SKU": sql2[j].name,
                            "QtyOrdered": sql2[j].quantity,
                            "UnitPrice": sql2[j].price
                        };
                    }
                });
                return orderLineJson;
            };

最佳答案

处理异步操作时不能使用return。我建议学习并实践 Promise。一开始它们有点难以理解,但一旦你明白了,我想你会更喜欢它们而不是连续传递,你可以从那里开始。

现在,您需要学习使用回调。 Promise 仍然使用回调。将回调传递给异步函数并在其异步操作完成时调用它:

function getOrderLines(orderId, cb) {
    mysql.query('QUERY', function (err, sql2) {
        // handle err

        cb(/* processed data */)
    });
}

当您调用 getOrderLines 时,您可以传递该回调,这允许您使用传递给它的值:

getOrderLines(sql1[i].Id, function (err, result) {
    res.json(result);
});

关于javascript - Node.js 处理异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34951248/

相关文章:

javascript - JS : How to make Div's appear on click but not append? 像一个工具提示

mysql float 最小值列

javascript - 如何通过 jquery 传递 'this' 元素。 ('click' ) 到内部函数

javascript - polymer .html : Uncaught TypeError: Failed to execute 'dispatchEvent' on 'EventTarget' : parameter 1 is not of type 'Event'

mysql - 从整数年、月和日期构造 java.sql.Date

mysql - Course_code的适当数据类型是什么?

java - HTTP post 请求返回 HTML 代码而不是 JSON 数据

python - SQLAlchemy Postgres 查询是 JSON 中存在的键

java - Jackson 解析包含对象数组和带有动态键的映射数组的 JSON

javascript - 调用 Cloud Function HTTP 触发器时发生 CORS 策略错误