1

我正在使用 Express4 构建 NodeJS 服务器。我将此服务器用作前端 Angular 应用程序和 3rd 方 API 之间的中间人。我创建了我的前端应用程序请求的某个路径,我希望在该路径上多次调用 API 并合并所有响应,然后发送结果响应。我不确定如何执行此操作,因为我需要等到每个 API 调用完成。示例代码:

app.post('/SomePath', function(req, res) {
  var merged = [];
  for (var i in req.body.object) {
    // APIObject.sendRequest uses superagent module to handle requests and responses
    APIObject.sendRequest(req.body.object[i], function(err, result) {
      merged.push(result);
    });
  }
  // After all is done send result
  res.send(merged);
});

正如您所看到的,我在一个循环中调用 API,具体取决于我在请求中收到多少 APIObject.sendRequest。

完成所有操作并合并 API 响应后,如何发送响应?

谢谢你。

4

2 回答 2

1

查看这个答案,它使用Async模块同时发出几个请求,然后在它们全部完成时调用回调。

根据@sean 的回答,我相信each会比map.

然后它看起来像这样:

var async = require('async');
async.each(req.body.object, function(item, callback) {
  APIObject.sendRequest(item, function(err, result)) {
    if (err)
      callback(err);
    else
    {
      merged.push(result);
      callback();
    }
  }
}, function(err) {
     if (err)
       res.sendStatus(500); //Example
     else
       res.send(merged);
});
于 2015-11-04T16:57:16.683 回答
0

首先,您不能在循环中执行异步方法,这是不正确的。

您可以使用模块async地图功能

app.post('/SomePath', function(req, res) {
  async.map(req.body.object, APIObject.sendRequest, function(err, result) {
    if(err) {
      res.status(500).send('Something broke!');
      return;
    }
    res.send(result);
  });
});
于 2015-11-04T17:00:03.977 回答