我正在尝试找到一种方法来发送多个请求(使用Express)并在一个函数中处理所有响应。
这是我的代码:
// In router.js
app.get('/api/FIRST_PATH', CALLBACK_FUNCTION_A );
// In CALLBACK_FUNCTION_A file :
module.exports = function (req, response) {
CALLBACK_FUNCTION_TO_SERVICE_A();
CALLBACK_FUNCTION_TO_SERVICE_B();
CALLBACK_FUNCTION_TO_SERVICE_C();
}
我的问题是发送请求CALLBACK_FUNCTION_TO_SERVICE_A,CALLBACK_FUNCTION_TO_SERVICE_B和CALLBACK_FUNCTION_TO_SERVICE_C,然后检索另一个函数中的所有结果来处理它们。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以了解有关新js标准的更多信息,并使用Promise
。
// In CALLBACK_FUNCTION_A file :
module.exports = function (req, response) {
var promises = [CALLBACK_FUNCTION_TO_SERVICE_A(),
CALLBACK_FUNCTION_TO_SERVICE_B(),
CALLBACK_FUNCTION_TO_SERVICE_C()];
Promise.all(promises).then( function(results) {
//results is an array
//results[0] contains the result of A, and so on
});
}
当然CALLBACK_FUNCTION_TO_SERVICE_A()
并且需要返回Promise
个对象。你形成了这样一个函数:
function asyncFunction(callback) {
//...
callback(result);
}
你可以像这样创建一个Promise:
var p = new Promise(asyncFunction);
它将开始运行该函数,并支持Promise接口。
例如,要么使用request-promise
,要么可以执行以下操作:
function CALLBACK_FUNCTION_TO_SERVICE_A() {
var worker = function(callback) {
app.get('/api/FIRST_PATH', callback);
};
return new Promise(worker);
}
您可以详细了解Promise
以及如何轻松处理错误。
答案 1 :(得分:1)
您可以使用async parallel。您可以将所有API调用保留为async.parallel
数组或JSON(示例使用数组)。
async.parallel(
[
function(done){
reqServcieA(..., funnction(err, response){
if(err) done(err,null);
done(null, response);
}
},
function(done){
reqServcieA(..., funnction(err, response){
if(err) done(err,null);
done(null, response);
}
},
...// You can keep as many request inside the array
], function(err,results){
// Will be called when all requests are returned
//results is an array which will contain all responses as in request arry
//results[0] will have response from requestA and so on
});