[英]Push asynchronous response into a array in NodeJS
我有一個元素數組,通過這些元素迭代並進行一些RPC調用以獲取響應,將響應推入數組並將其發送回UI進行顯示。 但是這些響應是異步的,不會被推入數組。 因此,當在UI端收到響應時,該響應為空。
NodeJS代碼:
app.get('/getData/:obj', function(req,res, next){
data = JSON.parse(req.params.obj);
var options = ["location","start","end","user"];
/*Data looks like this*/
/*[ { start: '12-05-2016' },
{ end: '12-09-2016' },
{ location: [ 'US','UK' ] },
{ user: [ 'Jim','Jack' ] } ]*/
var requestArray = [];
for(var d in data) {
if(options.indexOf(d) > -1 ) {
var rpcRequest = {};
rpcRequest[d] = data[d]
requestArray.push(rpcRequest);
}
}
console.log(requestArray);
var resp = []
for(var i in requestArray) {
var item = requestArray[i];
_.each(item, function(value, key) {
console.log('key :'+key+'\tvalue: '+value);
if(util.isArray(value)) {
for(var val in value) {
var request = {};
request[key] = value[val];
console.log('\tkey :'+key+'\tvalue: '+value[val]);
console.log('request: '+JSON.stringify(request));
switch(key) {
case "location":
rpcClient.location(request, function(err, response) {
response = (JSON.stringify(response)); //asynchronous response
resp.push(response); //push response into array
});
break;
case "user":
rpcClient.user(request, function(err, response) {
response = JSON.stringify(response); //asynchronous response
resp.push(response); //push response into array
});
break;
default: break;
}
}
}
});
}
console.log(resp);
res.send({d:resp}); // send the response array, but it is empty
});
如何使數據同步推入數組或以某種方式獲取正確的數據。 我聽說過異步模塊,但不確定在這里如何使用它。
尋求幫助! 謝謝 :)
您等待呼叫res.send
直到收到最后一個響應。
因此,您可以跟蹤收到的響應數量以及收到的最后一個響應時, 然后從響應回調中為最終響應調用res.send
。
這是一個簡化的示例:
var requests = [ "one", "two", "three", "four", "five" ]; var responses = []; requests.forEach(function(request) { // setTimeout to get something async setTimeout(function() { // Now we're in the async operation callback var response = "Response for " + request; console.log("Got: " + response); // Save the response responses.push(response); // Is it the last one? if (responses.length == requests.length) { // We're done, this is where you'd do // `res.send` console.log("Done! Got all responses: ", responses); } }, Math.random() * 1000); });
注意:不要使用for-in
遍歷數組,除非您因為數組稀疏而故意這樣做; 那不是它的目的。 有關遍歷數組的各種選項,請參見此問題的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.