Javascript Node.js从HTTP请求异步返回

Javascript Node.js从HTTP请求异步返回,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我对JS和node非常陌生。我试图从异步http请求返回一个变量,我认识到问题在于调用的异步性质,但尽管阅读了多个教程,仍然无法理解如何生成一个非常简单的代码段函数 有人能帮我做个标记,这样我就可以消化并修改它以供我自己使用吗?我应该使用异步库吗?我尝试了几次,但都没能成功 var request=require('request'); a=0; a=foo(); 函数foo(){ var-num=1; 请求('http://www.google.com,函数(错误、响应、正文){ //con

我对JS和node非常陌生。我试图从异步http请求返回一个变量,我认识到问题在于调用的异步性质,但尽管阅读了多个教程,仍然无法理解如何生成一个非常简单的代码段函数

有人能帮我做个标记,这样我就可以消化并修改它以供我自己使用吗?我应该使用异步库吗?我尝试了几次,但都没能成功

var request=require('request');
a=0;
a=foo();
函数foo(){
var-num=1;
请求('http://www.google.com,函数(错误、响应、正文){
//console.log('error:',error);//如果发生错误,请打印错误
//console.log('statusCode:',response&&response.statusCode);//如果收到响应,则打印响应状态代码
//log('body:',body);//打印Google主页的HTML。
num=3;
返回回调(num);
})
返回num;
}

控制台日志(a)您必须/只能对其回调内的异步调用的结果进行操作,因为

  • 回调不返回值
  • 回调无法访问周围的上下文,因此在您的示例中,在触发回调时未定义
    num
    ,并且
  • 您无法知道回调何时完成,因此其结果可用

  • 在您的示例代码中,foo总是会立即返回
    1
    ,而不考虑从
    request

    返回的响应/正文,因此我将假设您的请求是正确的,并将重点放在回调的概念上。如果你尝试了这个,但仍然需要更多的帮助,请告诉我

    我将尽量使此代码与您已有的代码保持一致:

    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的值,则需要将它们作为参数传递给已传入的回调函数。如果您尝试更多地遵循回调样式,您可能会更接近这一点

    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提到的那样,回调通常不会返回。相反,您让您的函数调用传入的另一个函数,并为该函数提供您的函数确定的参数

    你调试代码了吗?你的返回返回到请求模块的某个地方!谢谢!这显然是可行的,需要我以不同的方式构建代码。非常感谢。尝试使用async/await这样做有意义吗?我承认我对async await不是很熟悉。对于这样简单的东西,我不会使用async await。对我来说,这真的取决于情况的复杂性。