在NodeJs中我怎么能等到我的http get完成?

时间:2014-03-19 21:19:05

标签: javascript node.js httprequest

编辑:我想更清楚地解释问题,我的目的是在" 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;
  });

1 个答案:

答案 0 :(得分:0)

由于node主要是异步的并且使用回调(而不是promises),因此您可能希望定义一个将被调用的函数,该函数接受一个参数,该参数是异步调用的输出。

例如(在您的情况下):您在courseName的回调中得到response.on('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被分配到正确值之前。

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

注意:

  • 您应该使用类似mikeal/request之类的内容向外发出请求,因为它是专门为此而写的。