簡體   English   中英

將異步響應推入NodeJS中的數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM