问题描述
我试图写一些东西,从数据库中获取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楼
您不能使用在这样的循环中异步获取结果的函数。 您应该改用类的 :
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});
});