我有一个JavaScript(节点)功能来抓取网页的内容并通过回调来处理它:
'using strict';
var http = require('http');
function download(url, callback) {
http.get(url, function(res) {
var content = '';
res.on('data', function (chunk) {
content += chunk;
});
res.on('end', function() {
callback(content);
});
}).on('error', function() {
callback(null);
});
}
我不明白为什么我不能简单地将结果返回到“结束”。显然,当“结束”时,事件被发出,'内容'变量包含一个包含网页内容的字符串,否则它无法提交给回调函数,那么为什么我不能像这样返回它:
function download2(url) {
http.get(url, function(res) {
var content = '';
res.on('data', function(chunk) {
content += chunk;
});
res.on('end', function() {
return content;
});
}).on('error', function() {
return null;
});
}
download2始终返回undefined。为什么呢?
答案 0 :(得分:4)
这些是异步函数。在调用回调函数之前,它们早已完成。因此,当您的任何一个下载函数返回时,不知道所需的返回结果。对于传递给异步回调的数据,您可以使用该回调本身对该数据执行某些操作。您可以将代码放在回调中处理该数据,也可以从回调中调用其他函数并将数据传递给它。
这是异步编程,你必须在节点中习惯它,因为它在那里使用了很多。它与同步编程明显不同,因为您无法调用启动异步操作的函数并期望父函数获取结果并返回它。直到父函数返回很久之后的某个时间才能知道异步操作的结果。
因此,您在第一个download()
函数中构建它的方式是处理此问题的常用方法。