在NodeJs中,我怎么才能等到我的http获得完成?

编辑:我想更清楚地解释这个问题,我的目的是在“webot.waitRule()”返回之前使http响应。 所以,http请求callback到webot.waitRule或其他方式?

下面是我在程序中实现一个模块的代码,而我的问题是函数在http请求得到响应之前返回。 我知道节点js中的http请求是asynchronous的,所以有任何解决scheme吗?我是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; }); 

由于节点主要是asynchronous的,并且使用callback(而不是承诺 ),所以您可能需要定义一个将被调用的函数,该函数接受一个参数,该参数是asynchronous调用的输出。

例如(在你的情况):你在response.on('end', ...的callback中获得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 

更多解释:在http.request调用完成之前,您的return courseName语句正在退出函数,因此在将courseName指定为适当的值之前。

更多编辑:我看了一下webot模块,它看起来像写不支持asynchronous代码的方式? 通常库会传递一个callback函数,当你的asynchronous处理完成后,你可以调用这个callback函数,比如function(info, callback) {} ,但是webot没有出现。 你最好的select可能是将courseName分配给info对象( info.courseName ),并通知你的程序在其他地方使用courseName。

笔记:

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