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

In NodeJs how can I wait until my http get is finished?

本文关键字:我的 http get 完成 怎么能 NodeJs      更新时间:2023-09-26

编辑:我想更清楚地解释这个问题,我的目的是在"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主要是异步的并且使用回调(与承诺相反),因此您可能希望定义一个将被调用的函数,该函数接受一个参数,该参数是异步调用的输出。

例如(在您的情况下):您在response.on('end', ...的回调中获得courseName。您可以定义如下函数:

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),并通知程序在其他地方使用courseName。

指出:

  • 你应该使用像mikeal/request这样的东西向外发出请求,因为它是专门为这样做编写的。