我怎样才能获得http.get的值?

时间:2011-07-11 17:36:05

标签: javascript node.js

我认为我对JavaScript的范围感到困惑。当我尝试使用代码(使用Node.js)时,我无法从第二个“ console.log()”获得任何输出。在这个程序中,我认为值变量在执行 http.get()之后应该有一些值,因为值变量在全局范围内。但是返回的价值不符合我的期望。

var http = require('http');

var options = {
    host: "www.example.com",
    path: "/index.html",
    port: 80
};

var value = "";
var ret = http.get(options, function(res) {
                       res.on("data", function(chunk) {
                                  value += chunk;
                              });
                       res.on("end", function(chunk) {
                                  console.log(value); // have some value...
                              })
                   });
console.log(value); // don't have any value...why?

我想知道发生了什么。提前谢谢!

(以下文字为补充)

非常感谢三位给我答案的家伙!我使用setTimeout延迟了第二个 console.log()的执行,如下所示。但我仍然有同样的问题。我想知道如何才能获得价值。

var http = require('http');

var options = {
    host: "www.example.com",
    path: "/index.html",
    port: 80
};

var value = "";
var ret = http.get(options, function(res) {
                       res.on("data", function(chunk) {
                                  value += chunk;
                              });
                       res.on("end", function(chunk) {
                                  console.log("first: " + value); // have some value...
                              })
                   });
setTimeout(function() {
               console.log("second: " + value); // don't have any value...why?
           }, 5000);

3 个答案:

答案 0 :(得分:2)

您正在http.get上定义一个回调函数,然后您正在执行,因此设置执行最终console.logvalue之前。与此同时,我不知道你的回调是否真的被调用了。尝试添加一些额外的console.log语句,以确保您的执行流程符合您的预期。

答案 1 :(得分:2)

这里的关键是异步回调。

function(res) {...}被调用并且http.get 完成时,会发生什么?它会向value添加值。但是,在http.get之后,它会在尚未填充的情况下记录value

基本上,

  1. http.get被称为
  2. console.log被称为
  3. http.get已完成,function(res) {...}被称为

答案 2 :(得分:1)

http请求是异步的。第二个console.log()(其中变量value没有值)实际上是在请求返回之前调用的,因此它具有与初始化时相同的值。