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