【问题标题】:JavaScript callback vs returnJavaScript 回调与返回
【发布时间】:2014-04-24 00:39:45
【问题描述】:

我有一个 JavaScript (Node) 函数来抓取网页的内容并通过回调处理它:

'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 总是返回未定义的。为什么?

【问题讨论】:

    标签: javascript node.js callback


    【解决方案1】:

    这些是异步函数。在回调函数被调用之前,它们早就完成了。因此,当您的任一下载函数返回时,都不知道所需的返回结果。对于传递给异步回调的数据,您可以使用该数据做某事的唯一地方是来自回调本身。您可以将代码放在回调中处理该数据,也可以从回调中调用其他函数并将数据传递给它。

    这是异步编程,你必须在 node 中习惯它,因为它在那里被大量使用。它与同步编程的显着不同在于,您不能调用启动异步操作的函数并期望父函数获取结果并返回它。异步操作的结果要等到父函数已经返回很久之后才能知道。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2017-07-15
      • 1970-01-01
      • 2016-07-23
      • 2012-12-24
      • 2014-09-25
      • 2019-03-02
      相关资源
      最近更新 更多