javascript - 了解节点中 http.get 的回调

标签 javascript asynchronous callback

这里是新的节点程序员,由于节点的异步性质,我很难理解如何从函数返回 http 请求的内容。这是我的程序的精简版本。

//#1
function getwebsite(url) {
    var body;
    http.get(url, function (res) {
        res.on('data', function (chunk) {
            body += chunk;
            //***Right here, I need 'body' returned out of this function***
        });
    });
}


//#2
var a = getwebsite('website1.com');
var b = getwebsite('website2.com');

//#3
console.log(a+b);

我想做的是 1:创建一个从站点获取数据的函数(如果重要的话,它的 JSON 和 XML),2:能够从程序中的任何位置调用该函数,3:是能够操纵从我的函数返回的任何数据。

您应该放置(和调用)回调函数的方式让我很头疼。我已经研究了 http.get 和一般回调示例的数十个示例,但还没有找到像我的示例中那样将两者合并的示例。经过一天的失败尝试后,我觉得如果有人能在我的示例中展示如何做到这一点,它最终可能会在我的大脑中响起(手指交叉)。

最佳答案

这是您想要用于普通回调样式的基本模式:

function getwebsite(url, cb) {
    var body = "";
    http.get(url, function (res) {
        res.on('data', function (chunk) {
            body += chunk.toString();
            // you can't return a value from this function
            // the return value would be swallowed by the function
            // that is calling this function
            // which is not your code, but internal Node.js code
        });
        res.on("end", function() {
          cb(null, body)
        })
        res.on("error" function(error) {
          cb(error)
        })
    });
}

getwebsite("a", function(error, contentsA) {
  if (error) throw "Error getting website A."
  getwebsite("b", function(error, contentsB) {
    if (error) throw "Error getting website B."
    console.log(contentsA)
    console.log(contentsB)
  })
})

您可能还想研究流量控制库,例如 Async (或我的基于 promise 的 Faithful ),或通用 promise 库,如 RSVP.js 。 不过,我建议首先熟悉回调的基础知识。

对于简单的http请求,使用request要容易得多。模块。那么您就不必绑定(bind)事件监听器。您只需拥有一个可以与 getwebsite 函数(有问题!)类似的方式使用的函数。

要熟悉异步编程,您可能需要尝试使用 fs.readFilefs.writeFile 读取和写入一些文件。例如,尝试将文件 A 的内容写入文件 B。这些都是非常简单的函数,但您需要正确处理回调流程。 Node的http模块相对来说比较复杂。或者使用请求模块,正如我提到的。

关于javascript - 了解节点中 http.get 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15715207/

相关文章:

在没有 try-catch 机制的情况下在纯 C 上捕获异常

javascript - 这段代码中定义了回调

java - Google Analytics Tracker Code (GATC) [a Javascript] 需要修改以使其能够在 JSF 中运行

javascript - 如何从折叠 btn( Bootstrap )显示下拉菜单?

java - Spring拦截返回异步调用

typescript - 类型 'awaited T' 的参数不可分配给类型 'T' 的参数

javascript - 意外的 token U Ajax 语法错误

javascript - 比较两个巨大对象数组的最有效方法

flutter - 当在Stream上使用Distinct()时似乎无法过滤出相同的结果

lua - 以局部变量为参数调用匿名函数