2015-11-04 71 views
0

我正在使用Express4构建NodeJS服务器。我使用这个服务器作为前端角应用和第三方API之间的中间人。 我创建了我的前端应用程序请求的某个路径,我希望在该路径上多次调用API并合并所有响应,然后发送响应结果。 我不知道如何做到这一点,因为我需要等到每个API调用完成。 示例代码:Node Express 4在多个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); 
}); 

正如你可以看到林取决于我内要求有多少APIObject.sendRequest收到的呼叫电话在一个循环中的API。

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

谢谢。

+0

问题是'APIObject.sendRequest'是异步的,所以'for'循环在实际请求完成之前结束? – Neta

+0

这里有很多问题,这就是其中之一。有没有其他方法可以做到这一点? – StrikoMirko

回答

1

检出this answer,它使用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); 
}); 
+0

哇这个人真是疯了,它马上就像是一样:D!好一个。日Thnx。你只是有一点附近的语法错误},function(err){,APIObject有一个你必须关闭的支架。 thnx再次这个异步模块岩! – StrikoMirko

+0

很高兴听到!语法错误已修复。 – Neta

0

首先,你不能在一个循环做一个异步方法,这是不正确的。可以使用the async module's map function

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); 
    }); 
}); 
+0

不完全正确,因为'map'用于更改数组的值。 “每个”都会更好。 – Neta

+0

@Neta我不知道你的意思吗?为什么你认为地图是用来改变数组的值? – Sean

+0

map用于将数据从一个类别转换为另一个类别,map不应该改变数组的原始值。 – Sean

相关问题