我试图理解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
有人可以帮助我理解为什么'我在这里,但为什么!'即使从“数据”返回后,行也会在控制台日志中打印为第二个输出行。事件发射器?这里的整体控制流程是什么?
答案 0 :(得分:3)
您首先看到该消息的原因是if
块中的代码所做的就是添加事件处理程序。在console.log
已经执行后,这些事件将在未来的某个时间发出。
这就是为什么在请求完成之前打印“从get google数据返回”的原因,因为http请求是异步的。