2016-12-05 123 views
1

我使用Express.js作为我的应用程序的中间件。我的前端应用程序每隔几秒用不同的参数调用一条快速路由。然后路由将每个参数调用到第三方api。在每个调用内部,数据都被添加到数组中。在for循环之后,我将数组发送回前端。Express JS发送数组始终为空

我在路由中声明数组,但返回的结果是空的。当我在路由之外声明数组时,它正在工作,但当多个请求同时发生时,这不是最佳的。

server.js

app.get('/prices', function(req, res){ 

//array for holding all feeds 
var feedData = []; 

//Url params 
var target = req.param('target'); 

//Convert the params to an array 
var targetArray = target.split(','); 

//Loop through targets and do request 
for (var i = 0; i < targetArray.length; i++) { 

    //API endpoint 
    var url = xxx; 
    request(url, function (error, response, body) { 

    //Parse the XML body to javascript objects or json 
    parseString(body, function (err, result) { 


    //Store result in js object 
    var resultObject = result; 
    var arrayObject = resultObject.quotes.quote; 

    feedData.push(arrayObject[0]) 

    }); 

}); 
} 
console.log(feedData); 
res.send(feedData); 

//Clear feedData 
feedData = []; 


}); 

所以底线是,数组为空。有什么建议么?

+1

'异步'请求 – Weedoze

回答

3

你被JS节点(当然,JavaScript)的

request的调用是异步的,并接受回调,但你踢脚过它,所以你最终console.log(feedData);等的异步性质咬伤呼叫在调用request的回调之前被调用。

看看在async模块,特别是eachSeries

你的代码的非测试例如,使用异步库:

app.get('/prices', function(req, res) { 

    //Url params 
    var target = req.param('target'); 

    //Convert the params to an array 
    var targetArray = target.split(','); 

    //array for holding all feeds 
    var feedData = []; 

    async.eachSeries(targetArray, function(targetArrayItem, cb) { 

     request(url, function(error, response, body) { 
      //Parse the XML body to javascript objects or json 
      parseString(body, function(err, result) { 


       //Store result in js object 
       var resultObject = result; 
       var arrayObject = resultObject.quotes.quote; 

       feedData.push(arrayObject[0]) 

       //call the callback to iterate next item in targetArray 
       cb(); 
      }); 
     }); 

    }, function(err) { 
     //all done 

     console.log(feedData); 
     res.send(feedData); 

     //Clear feedData 
     feedData = []; 
    }) 
}); 
+1

谢谢。我感觉我被异步列车撞到了,只是无法弄清楚。现在有道理。 – TietjeDK

+0

没有问题,很高兴它有帮助 – Alex

0

这是因为JavaScript是异步的,你发送的数据在准备就绪之前,您需要检查上次请求响应并返回收集的数据。

app.get('/prices', function(req, res){ 

//array for holding all feeds 
var feedData = []; 

//Url params 
var target = req.param('target'); 

//Convert the params to an array 
var targetArray = target.split(','); 

//Loop through targets and do request 
for (var i = 0; i < targetArray.length; i++) { 

    //API endpoint 
    var url = xxx; 
    request(url, function (error, response, body) { 

    //Parse the XML body to javascript objects or json 
    parseString(body, function (err, result) { 


    //Store result in js object 
    var resultObject = result; 
    var arrayObject = resultObject.quotes.quote; 

    feedData.push(arrayObject[0]); 

    //If is last request return result 
    if(i==targetArray.length-1){ 
      console.log(feedData); 
      return res.send(feedData); 
    } 
    }); 

}); 
} 
}); 
+0

这不会工作,你'targetArray'超出'request'的回调 - 没有什么迭代for循环 – Alex