试图传递一个填充数组到我的res.render.不确定如何进行适当的异步回调

Trying to pass a populated array to my res.render. Not sure how to make a proper async callback

本文关键字:不确定 render res 何进行 回调 异步 我的 数组 填充 一个      更新时间:2023-09-26

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

数组应该被填充,对吧?如果这只是一个异步问题,那么使执行顺序工作的良好实现是什么?

不能在这样的循环中使用异步获取结果的函数。您应该使用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});
});