• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Variablen eines Objektes in einem Array werden nicht geändert

Rocks360

New member
Hallo,
folgendes Problem: Ich habe zum einem eine Datei siegle-server.js:
Code:
var port = 8081;
var io = require('socket.io')(port, {pingTimeout: 60000, pingInterval:25000});
var allGameServer = [];

io.on('connection', function (socket) {
    allGameServer.push(require('./gameServer/gameServer.js')(socket));
  
});

var dismissGameServer = function(gameServer, index, allGameServer){ 
                console.log('GameServer with id: ' + gameServer.id + ' is ready to dismiss ? ' + gameServer.readyToDismiss);
                if(gameServer.readyToDismiss){
                    console.info('GameServer with ID: ' + gameServer.id + ' will now be dissmissed!' );
                    var delGameServer = allGameServer.splice(index, 1);
                    delGameServer = null;
                }
           };

 function interval(func, wait, times){
        var interv = function(w, t){
            return function(){
                if(typeof t === "undefined" || t-- > 0){
                    setTimeout(interv, w);
                    try{
                        func.call(null);
                    }
                    catch(e){
                        t = 0;
                        throw e.toString();
                    }
                }
            };
        }(wait, times);
    setTimeout(interv, wait);
    };
    
    interval(function(){
        console.info('number of GameServers: ' + allGameServer.length);
        if(allGameServer.length >= 1){
            console.info('Search for dismissable GameServers!');
            allGameServer.forEach(dismissGameServer);
        }
    }, 30000);

console.log('singe-server started on Port:' + port);

und die Datei gameServer.js die wie Folgt aussieht:

Code:
module.exports = function (client){
    var id = client.id;
    var readyToDismiss = false;
    var mysql = require('mysql');
    var dbConnection = mysql.createConnection({
        host     : 'localhost',
        user     : 'DBUser',
        password : 'rYddNgrb',
        database : 'testbase'
    });

    var player;
    var buildings = [];
    
    client.on('login', function(loginData){
        
    });
    client.on('disconnect', function (){
        // TODO Save Game in Database
        readyToDismiss = true;
        id = id + 'changed123';
        console.log('GameServer with ID: ' + id + ' can now dismissed! ' + readyToDismiss);
    });
    console.log('New GameServer with ID: ' + id);
   return{
       id : id,
       readyToDismiss : readyToDismiss,
   }
};

Nun wir alle 30 Sekunden die interval-Funktion ausgeführt, welche schaut ob ein GameServer gelöscht werden kann oder nicht. Falls readyToDismiss auf true gesetzt ist, soll das GameServer object gelöscht werden und wenn es false ist, soll nichts passieren. Nun habe ich jedoch das Problem, das readyToDismiss immer auf false gesetzt ist obwohl client.on('disconnect', function (){} ausgeführt wurde. Jemand eine Idee wieso dies so ist?
 
Du hast da eine Misskonzeption wie Objekte mit Variablen interagieren. In die Eigenschaft eines Objektes wird der Wert einer Variablen geschrieben und nicht eine Referenz auf die Variable. Wenn das anders wäre, könnte man ja keine unabhängigen Variablen/Eigenschaften erzeugen.

Du musst dein Objekt scon vorher in der Funktion erzeugen und dann in den anonymen Funktionen die Eigenschaftes des Objektes ändern:
Code:
module.exports = function (client){
    var ret = {
        id: client.id,
        readyToDismiss: false
    }
    var dbConnection = mysql.createConnection({
        host     : 'localhost',
        user     : 'DBUser',
        password : 'rYddNgrb',
        database : 'testbase'
    });

    var player;
    var buildings = [];
    
    client.on('login', function(loginData){
        
    });
    client.on('disconnect', function (){
        // TODO Save Game in Database
        ret.readyToDismiss = true;
        ret.id += 'changed123';
        console.log('GameServer with ID: ' + ret.id + ' can now dismissed! ' + ret.readyToDismiss);
    });
    console.log('New GameServer with ID: ' + ret.id);
    return ret;
};
 
Zurück
Oben