我正在尝试编写一些从数据库中获取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
阵列应该被填充,对吧?如果它只是一个异步问题,那么使执行顺序有效的实现是什么?
答案 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});
});