JavaScript回调与返回

Suu*_*aku 4 javascript callback node.js

我有一个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);
  });
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么我不能简单地在'end'上返回结果。显然,当发出“ end”事件时,“ content”变量包含一个包含网页内容的字符串,否则无法将其提交给回调函数,所以为什么我不能像这样返回它:

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;
  });
}
Run Code Online (Sandbox Code Playgroud)

download2始终返回未定义。为什么?

jfr*_*d00 5

这些是异步功能。它们在调用回调函数之前已经很长时间了。因此,当您的下载功能之一返回时,所需的返回结果是未知的。对于传递给异步回调的数据,您只能在回调本身中使用该数据。您可以将代码放入回调中以处理该数据,也可以从回调中调用其他函数并将数据传递给它。

这是异步编程,您真的必须在node中习惯它,因为它在这里已经使用了很多。它与同步编程的显着不同之处在于,您不能调用启动异步操作并希望父函数获取结果并返回结果的函数。直到父函数已经返回很长时间之后,异步操作的结果才知道。

因此,在第一个download()函数中对其进行结构化的方法是处理此问题的常用方法。