在1个函数之后具有表达式跳转的Nodej被直接调用到回调

时间:2014-07-17 06:54:41

标签: node.js web-services rest post express

我有一个示例函数,我希望在一个快速发布请求中触发3个sql查询

function getRelatedSalespersonByCardcode(req, res) {
    var reqJson = JSON.parse(req.body.json);
    var count = Object.keys(reqJson.cardcode).length;

    var tmpResult1, tmpResult2, tmpResult3 = [];


    var q = sql.open(connstr, function (err) {
        if (err) {
            console.log(err);
            return;
        }
        for (var i = 0; i < count; i++) {
            q.queryRaw("SELECT Division, Salesperson FROM SomeDB.dbo.MS2_Rel_BusinessPartnerSalesperson WHERE CardCode = " + reqJson.cardcode[i], function (e, results) {
                if (e) {
                    console.log(e);
                    return;
                }
                tmpResult1.push(results);
            });

            q.queryRaw("SELECT SlpCode, SlpName, Memo, Commission, GroupCode, UserSign, Active, U_wpABIS, U_sweDW," +
                " U_sweATT, U_sweDIV, U_sweEMPLOYEE, U_sweRETAILER FROM SomeDB.dbo.OSLP WHERE U_sweId = " + tmpResult1[1], function (e, results) {
                if (e) {
                    console.log(e);
                    return;
                }
                tmpResult2.push(results);
            });

            q.queryRaw("SELECT Code, Name, U_sweSALES FROM SomeDB.dbo.[@SWEDIV] WHERE Code = " + tmpResult3[0], function (e, results) {
                if (e) {
                    console.log(e);
                    return;
                }
                tmpResult3.push(results);
            });
        }
    });

    res.send(200, tmpResult2);

}

无论如何在我的req中调用了1个函数之后,res函数的回调是triggert ..所以它直接跳转到res.send(...)行。

我已经玩了一下,似乎这就是表达的方式。

经过一段时间的谷歌搜索后,我发现我必须使用异步库。

我想问一下为什么express会像这样工作,如果有人可能有比async方法更好的解决方案。我只需要一种方法来实现我的场景。

1 个答案:

答案 0 :(得分:1)

这不是明确的问题,也不是问题。这就像node.js异步编程正在工作。让我们来看看你的代码中发生了什么:

var tmpResult2;

// 1. async open sql connection
var q = sql.open(connstr, function (err) {
    // 3. query sql connection
});

// 2. render result
res.send(200, tmpResult2);
  1. 异步打开SQL连接。
  2. 调用快速渲染。
  3. 执行SQL查询。
  4. 因此,此代码片段在获取数据之前将数据发送到客户端。因此,最简单的解决方案是在回调中调用res.send,如下所示:

    var tmpResult2;
    
    // 1. async open sql connection
    var q = sql.open(connstr, function (err) {
      // 2. render result
      res.send(200, tmpResult2);
    });
    

    您可以使用精彩的async模块来处理查询(请查看async waterfall函数。)