繁体   English   中英

在节点中了解http.get的回调

[英]Understanding callbacks with http.get in node

这里是新节点程序员,由于节点的异步性质,我很难理解如何从函数返回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 ),或通用的承诺库,如RSVP.js。 我建议首先习惯回调的基础知识。

对于简单的http请求,使用请求模块要容易得多。 您不必再绑定事件侦听器。 你只需要一个与getwebsite函数类似的函数(它有问题!)。

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

在数据有机会返回之前,您正在调用console.log()。 您可以将body变量置于更高的范围并附加到该范围。

var body;

function getwebsite(url) {
    http.get(url, function (res) {

        res.on('data', function (chunk) {
            body += chunk;
            //***Right here, I need 'body' returned out of this function***
            outputBody(body);
        });
    });
}
var a = getwebsite('website1.com');
var b = getwebsite('website2.com');

function outputBody(val){
    console.log(val);
}

暂无
暂无

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

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