试图将填充的数组传递给我的res.render。不确定如何进行正确的异步回调

时间:2015-08-08 00:39:50

标签: javascript arrays node.js asynchronous express

我正在尝试编写一些从数据库中获取IP列表的内容,然后从服务器检索信息,填充对象,然后将该对象传递给数组。我似乎能够填充每个对象,并且我可以告诉它,它被传递给数组,但是当网页加载(或者我执行我的数组的控制台日志)时,它就是总是空的。我有理由相信它与同步写入有关。我还是异步/同步差异和功能的新手。我尝试了一些我认为可行的方法,但无论如何,我似乎都得到一个空数组。

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


//1) Read out the entries from the database.
db.all('SELECT * FROM servers', function (err,rows) {
        var servers = rows;
        var serverList = [];


    //2) parse each one with a for Each from the steamServerStatus
        servers.forEach( function (server) {

                var ip = server.ip;
                var port = server.port;
                //3) Populate an array with each object
                steamServerStatus.getServerStatus(ip, port, function (serverInfo) {
                        var serverToken = {};

                        serverToken.ip = ip;
                        serverToken.serverName = serverInfo.serverName;
                        serverToken.playerCount = serverInfo.numberOfPlayers + "/" + serverInfo.maxNumberOfPlayers;
                        serverList.push(serverToken);       
                }); // end serverstatus
    }); // end forEach

    //4) Pass that out to our res.render
        res.render('pages/index', { servers: serverList });
}); //End db.all

阵列应该被填充,对吧?如果它只是一个异步问题,那么使执行顺序有效的实现是什么?

1 个答案:

答案 0 :(得分:0)

您不能使用在循环中异步获取结果的函数。您应该使用类似async.each的内容:

var serverList = [];
async.each(servers, function eachServer(server, done) {
  server.getItsThing(function onThing(err, thing) {
    if (err) return done(err);
    serverList.push(thing);
  });
}, function onAllServersDone() {
  res.render('pages/index', { servers: serverList});
});