了解Node.js应用程序中的控制流

时间:2015-01-26 19:02:44

标签: javascript node.js

我试图理解Node.js应用程序中的控制流。具体来说,一旦回调方法完成,控制就会返回到原始函数(就像递归调用中的回调堆栈一样)。我写了一个简单的程序,它进行GET调用并返回数据。这是程序:

代码:

var async = require('async');
var http = require('http');

function getGoogleData(url, callback) {
    http.get(url, function(response) {
        if (response.statusCode == 200) {
            var googleInfo = '';
            response.on('data', function(chunk) {
                console.log("receiving data... ");
                googleInfo += chunk;
                return;
            });
            response.on('end', function() {
                console.log("End of data receive... ");
                response.setEncoding('utf8');
                return callback(null, googleInfo);
            });
        }
        console.log("I am here but why!");
        //callback(new Error("GET called failed status_code=" + response.statusCode));
    });
    console.log("Return from get google data");
}

async.waterfall([
    function(callback) {
        console.log("In func 1");
        getGoogleData("http://www.google.com", callback);
    },
    function(data, callback) {
        console.log("In func 2");
        callback(data);
    }],
    function (err, res) {
        console.log("In err fn");
    });

这是程序的输出: 的输出:

In func 1
Return from get google data
I am here but why!
receiving data...
receiving data...
End of data receive...
In func 2
In err fn

有人可以帮助我理解为什么'我在这里,但为什么!'即使从“数据”返回后,行也会在控制台日志中打印为第二个输出行。事件发射器?这里的整体控制流程是什么?

1 个答案:

答案 0 :(得分:3)

您首先看到该消息的原因是if块中的代码所做的就是添加事件处理程序。在console.log已经执行后,这些事件将在未来的某个时间发出。

这就是为什么在请求完成之前打印“从get google数据返回”的原因,因为http请求是异步的。