Node.js从HTTP请求返回异步

时间:2017-06-09 19:40:54

标签: javascript node.js asynchronous

我对JS和节点都很陌生。我试图从异步http请求返回一个变量,我发现问题是调用的异步性质,但无法弄清楚如何编写一个非常简单的代码片段函数,尽管阅读了多个教程。

有人可以对此进行标记以使其有效并且我可以将其消化并修改以供我自己使用吗?我应该使用异步库吗?我已经做了几次尝试,并且没有能够做到这一点。



var request = require('request');
a = 0;

a = foo();
function foo() {
   var num = 1;
   request('http://www.google.com', function (error, response, body) {
        // console.log('error:', error); // Print the error if one occurred
        //console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
        //console.log('body:', body); // Print the HTML for the Google homepage.
        num = 3;
        return callback(num);
    })
   return num;
}

console.log(a);




2 个答案:

答案 0 :(得分:0)

您必须/只能在其回调中对异步调用的结果进行操作,因为

  1. 回调不返回值,
  2. 回调无法访问您周围的上下文,因此在您的示例中,在触发回调时未定义num,并且
  3. 您无法知道回调何时完成,因此其结果可用。
  4. 在您的示例代码中,foo将始终立即返回1,而不管request返回的响应/正文。

答案 1 :(得分:0)

所以我假设你正确地提出了你的请求,而是专注于回调的想法。如果您尝试这个并仍需要更多帮助,请告诉我。

我会尝试将此代码保持接近您已有的代码:

function foo(callback){
   request('http://www.google.com', function (error, response, body) {
      if(error)
        console.log(error);
      //console.log('statusCode:', response && response.statusCode); 
      // Print the response status code if a response was received
      //console.log('body:', body); // Print the HTML for the Google homepage.
      num = 3;
      callback(num);
    })
}

然后为了打印3,你会做这样的事情。

foo(function(value){
   console.log(value);
})

在这种情况下,您会看到打印出的值为3。

如果你想返回更多只有3,你需要将它们作为参数传递给已传入的回调函数。如果你试图更多地遵循回调样式,你可能会更接近这个。< / p>

function foo(callback){
   request('http://www.google.com', function (error, response, body) {
     if(error)
        callback(error,null);
     //do what ever you need to with the response and body
     num = 3;
     callback(null,num);
    })
} 
foo(function(err, value){
   if(err)
      console.log(err);
   console.log(value);
})

你只需要记住,通过回调,如Rob提到,你通常不会回来。相反,您可以使用函数调用另一个传入的函数,并使用函数确定的参数提供该函数。