当前位置: 代码迷 >> JavaScript >> 尝试将填充的数组传递给我的res.render。 不确定如何进行适当的异步回调
  详细解决方案

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

热度:118   发布时间:2023-06-07 15:32:30.0

我试图写一些东西,从数据库中获取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

该数组应该被填充,对吗? 而且,如果这只是一个异步问题,那么使执行顺序正常工作的最佳实现是什么?

您不能使用在这样的循环中异步获取结果的函数。 您应该改用类的 :

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});
});
  相关解决方案