express中使用request,如何返回异步获得的结果?

灯盏细辛
  • 222
// app.js使用t.js控制/t的路由
app.use('/t',require('t'));

在t.js(router)中,要send回tt.topic的值,这里是个JSON

router.get('/:id',function(req, res) {
  var api = tt.topic(req.params.id);
  res.send(api);
});

在tt.js(model)中,要通过Request获得数据进行过滤返回

tt.topic = function(id) {

  var apiurl = 'api url';

  var s = req(apiurl,doTheRequest);

  function doTheRequest(error, response, body) {
    if (!error && response.statusCode == 200) {
      var data = JSON.parse(body).result;
      console.log(data); // 我这里能拿到数据,但由于是异步的,怎么返回给主进程,进而通过res.send(data)出去?
    }
  }
  return obj; // 这个无效,异步执行去了,这里返回undefined
}

module.exports = tt;

问题都在代码中了,request异步后怎么把值能返回给调用request的函数?进而返回给router,去res.send?
查了API,request没有end这种事件?
上Q.js能起到作用么?

评论
阅读 10.7k
1 个回答
✓ 已被采纳

都异步了,就异步到底呗,别老想return了
一般tt.topic里把res传递进去就可以了吧

tt.topic = function(id, res) {
  var apiurl = 'api url';
  var s = req(apiurl,doTheRequest);

  function doTheRequest(error, response, body) {
    if (!error && response.statusCode == 200) {
      var data = JSON.parse(body).result;
      res.send(data);
    }
  }
}

router.get('/:id',function(req, res) {
    tt.topic(req.params.id, res);
});

至于Q.js我没用过,我只用过js原生的promise,node.js上应该可以用node的Promise库
大概把tt.topic改成这样

tt.topic = function(id) {
  return new Promise(function(resolve, reject) {
      var apiurl = 'api url';
      var s = req(apiurl,doTheRequest);

      function doTheRequest(error, response, body) {
          if (!error && response.statusCode == 200) {
              var data = JSON.parse(body).result;
              resolve(data);
          } else 
          reject(error);
      }
  });
}

router.get('/:id',function(req, res) {
  tt.topic(req.params.id).then(function(data) {
    res.send(data);
  });
});
撰写回答

登录后参与交流、获取后续更新提醒

宣传栏