Javascript 在NodeJs中,如何等待http get完成?

Javascript 在NodeJs中,如何等待http get完成?,javascript,node.js,httprequest,Javascript,Node.js,Httprequest,编辑:我想更清楚地解释这个问题,我的目的是在“webot.waitRule()”返回之前做出http响应。那么http请求应该回调webot.waitRule还是反过来呢 下面是我在程序中实现模块的代码,我的问题是 函数在http请求得到响应之前返回。我知道节点中的http请求 js是异步的,所以有什么解决方案吗?我对javascript和nodejs非常熟悉。谢谢 webot.waitRule('wait_class', function(info) { var courseName

编辑:我想更清楚地解释这个问题,我的目的是在“webot.waitRule()”返回之前做出http响应。那么http请求应该回调webot.waitRule还是反过来呢

下面是我在程序中实现模块的代码,我的问题是 函数在http请求得到响应之前返回。我知道节点中的http请求 js是异步的,所以有什么解决方案吗?我对javascript和nodejs非常熟悉。谢谢

 webot.waitRule('wait_class', function(info) {
    var courseName='lol';
     var options = {
        host: 'api.uwaterloo.ca',
        path: '/v2/courses/CS/486/examschedule.json'
      };
      callback = function(response) {
          var str = '';
  //another chunk of data has been recieved, so append it to `str`
          response.on('data', function (chunk) {
          str += chunk;
        });
          response.on('end',function(){
        // console.log(str);
         // return "kkk";
         var data = JSON.parse(str);
         console.log(data['data']['course']);
         courseName = courseName+data['data']['course'];
         console.log("finished");
         // return "lolllll";
         // return "nide ke shi "+ courseName;
      });
    }
    var req = http.request(options, callback);
    req.end();
    console.log("i am finshed");
     return courseName;
  });

由于node主要是异步的,并且使用回调(与之相反),所以您可能希望定义一个将被调用的函数,该函数接受一个参数,该参数是异步调用的输出

例如(在您的案例中):您在
响应的回调中获得
courseName
。在('end',…
)上,您可以定义一个函数,例如:

function processCourseName(name) {
    console.log('do something with', name);
}
然后在
console.log('finished');
之后,只需添加对该方法的调用

...
courseName = ...
console.log("finished");
processCourseName(courseName); //whenever the request is finished, then process the course name in a separate function
更多说明:您的
return-courseName
语句在
http.request
调用完成之前退出函数,因此在
courseName
之前甚至被指定了一个正确的值

更多编辑:我看了一下模块,它的编写方式似乎不支持异步代码?通常库会传递一个回调函数,当异步处理完成时,可以调用它,比如
function(info,callback){}
,但
webot
似乎没有。您最好将
courseName
分配给
info
对象(
info.courseName
),并通知您的程序在其他地方使用courseName

注:

  • 您应该使用类似于向外发出请求的东西,因为这是专门为此编写的

返回在异步函数中没有意义…它应该说“已完成”当完成时否?请注意,
回调
是全局性的…您需要使用回调。看起来您已经开始这样做了,所以我不确定问题出在哪里。这是一个关于从使用异步调用的函数返回数据的数百个其他问题的dup。标记为dup。首先,在异步环境中使用return是不可能的这根本不是一个好的做法。你应该用更好的设计来代替返回,比如模块模式。这样,你就可以让courseName变量对模块可用。顺便说一下,你可以使用Async.js series函数在函数调用之间进行同步。