【问题标题】:In NodeJs how can I wait until my http get is finished? [duplicate]在 NodeJs 中,我如何才能等到我的 http get 完成? [复制]
【发布时间】:2014-03-19 21:19:04
【问题描述】:

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

【问题讨论】:

  • return 在异步函数中没有意义......它应该说“完成”时没有完成?
  • 注意callback 是全局的...
  • 你需要使用回调。看起来你已经开始这样做了,所以我不太确定问题出在哪里。
  • 这是关于从使用异步调用的函数返回数据的数百个其他问题的重复。标记为 dup。
  • 首先,在异步环境中使用 return 根本不是一个好习惯。您应该用更好的设计替换返回,例如模块模式。这样,您就可以为模块提供 courseName 变量。附带说明一下,您可以使用 Async.js 系列函数在函数调用之间进行同步。

标签: javascript node.js httprequest


【解决方案1】:

由于节点主要是异步的并且使用回调(与 promises 相对),您可能希望定义一个将被调用的函数,该函数接受一个参数,该参数是您的异步​​调用的输出。

例如(在您的情况下):您在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 之类的东西向外发出请求,因为它是专门为此编写的。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 2016-05-19
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多