2015-11-04 72 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

相關問題