Node.js不等待数据

时间:2016-04-23 08:20:16

标签: javascript node.js

function checkContact(req, res) {
    for (var numb in req.body) {

        console.log(numb + ":" + req.body[numb]);

        checkValue(numb, function(err, result) {
            if (result) {
                console.log(result);
                send[result] = "true";
                console.log(send);

            }
            if (err) {
                console.log(err + "not");
            }
        });
    }

    res.json(send);

}

function checkValue(number, callback) {

    mongo.connect(conn, function() {

        var doc = mongo.collection("user");
        doc.findOne({
            number: number
        }, function(err, res) {
            if (res) {

                //console.log(send+"val");
                //send[number]="true";
                callback(null, number);

            }

        });
        callback(null, 0);
    });

}

此处res.json(send)立即执行,无需等待数据放入send变量。我知道node.js是异步的,这就是它的执行方式。有没有办法只在for循环执行完毕后才能发送响应?提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

因为Node.JS是异步的,所以你需要在回调中嵌入它。

function checkContact(req, res) {
    var reqLength = req.body.length;

    for (var numb in req.body) {

        console.log(numb + ":" + req.body[numb]);

        checkValue(numb, function(err, result) {
            if (result) {
                console.log(result);
                send[result] = "true";
                console.log(send);

            }
            if (err) {
                console.log(err + "not");
            }

            reqLength--;

            if(reqLength === 0) {
                res.json(send);
            }
        });
    }
}

答案 1 :(得分:0)

Nodejs使用异步调用,您应该尝试Promises等待和发送响应 阅读这篇文章它会帮助你

[http://12devs.co.uk/articles/promises-an-alternative-way-to-approach-asynchronous-javascript/][1]