繁体   English   中英

JavaScript回调vs返回

[英]JavaScript callback vs return

我有一个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);
  });
}

我不明白的是为什么我不能简单地在'结束'上返回结果。 显然,当'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;
  });
}

download2总是返回undefined。 为什么?

这些是异步函数。 在调用回调函数之前,它们早已完成。 因此,当您的任何一个下载函数返回时,不知道所需的返回结果。 对于传递给异步回调的数据,您可以使用该回调本身对该数据执行某些操作。 您可以将代码放在回调中处理该数据,也可以从回调中调用其他函数并将数据传递给它。

这是异步编程,你必须在节点中习惯它,因为它在那里使用了很多。 它与同步编程明显不同,因为您无法调用启动异步操作的函数并期望父函数获取结果并返回它。 直到父函数已经返回很久之后的某个时间才能知道异步操作的结果。

因此,在第一个download()函数中构造它的方式是处理它的常用方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM