2016-07-07 25 views
1

Ich arbeite mit Socket.io und MongoDB. Wenn ich zuerst meine socket.emit an den Server sende, übernimmt der Server den Parameter und kehrt mit meiner gewünschten Ausgabe zurück. Wenn ich die socket.on auf meinem client.js erreiche, wird die OrderID der Konsole angezeigt. Wenn ich jedoch den socket.on Methodenblock verlasse, wird die GenOrderID Variable undefined.Socket.io - Variablen, die nicht aktualisiert werden Outside socket.on

Meine Frage ist: Warum sind Variablen, die vor der socket.on erstellt wurden, nicht mehr außerhalb zugänglich. Hier

ist die client.js Ich arbeite mit:

// Create order array 
var Order = []; 

// Create GeneratedOrderID variable 
var GenOrderID; 

// Get School ID from cookie 
var SchoolID = getCookie("SchID"); 

// Generate OrderID 
socket.emit('GenerateOrderID', SchoolID); 

socket.on('GenerateOrderID', function(GeneratedOrderID) { 
    console.log("OrderID sent from server is: " + GeneratedOrderID); // This returns the desired number 
    GenOrderID = GeneratedOrderID; 
}); 

Order[0] = GenOrderID; 
console.log("GenOrderID is: " + GenOrderID); // This returns undefined 
console.log("Order[0] is: " + Order[0]); // This returns undefined 

Hier ist die server.js ich arbeite mit:

socket.on('GenerateOrderID', function(PassSchoolID) { 
    // Connect to database 
    MongoClient.connect('mongodb://localhost:27017/Orders', function(err, db) { 
     // Handle errors 
     assert.equal(null, err); 
     console.log("Begin creation of OrderID"); 
     db.collection('Orders').find({SchoolID: PassSchoolID}).sort({amount: -1}).limit(1).forEach(function (result) { 
      var GeneratedOrderID = parseInt(result.OrderID); 
      GeneratedOrderID++; 
      console.log("The server says the OrderID is: " + GeneratedOrderID); // This returns the desired number 

      // Return to client 
      socket.emit('GenerateOrderID', GeneratedOrderID); 
     }); 
    }); 
}); 
+0

Ihre Variablen sind außerhalb zugänglich, aber Ihre 'console.log()' feuert vor 'socket.on()', was ein asynchroner Mechanismus ist. – dvlsg

+0

@dvlsg Also die 'console.log()' 's außerhalb der' socket.on() 'feuern danach? –

+0

Der allgemeine Ablauf dieser (wahrscheinlich) sein wird: Client emittieren, Client-Setup '.on()' Callback, Client 'console.log()' feuert, Server empfängt 'GenerateOrderID', Server sendet' GenerateOrderID', Client empfängt 'GenerateOrderID', Client setzt' GenOrderID' - aber die 'console.log()' ist lange von diesem Punkt aus erledigt. Sie könnten versuchen, [this] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) zu lesen, wenn Sie noch nicht haben. Es ist nicht das, was Sie hier verwenden (das wäre eher ein EventEmitter), aber das allgemeine Konzept ist das gleiche. – dvlsg

Antwort

1

Durch die console.log() innerhalb des socket.on platzieren ich in der Lage war, es zu haben zu arbeiten richtig.

// Create order array var 
Order = []; 

// Create GeneratedOrderID variable 
var GenOrderID; 

// Get School ID from cookie 
var SchoolID = getCookie("SchID"); 

// Generate OrderID 
socket.emit('GenerateOrderID', SchoolID); 

socket.on('GenerateOrderID', function(GeneratedOrderID) { 
    console.log("OrderID sent from server is: " + GeneratedOrderID); 
    GenOrderID = GeneratedOrderID; 

    Order[0] = GenOrderID; 
    console.log("GenOrderID is: " + GenOrderID); 
    console.log("Order[0] is: " + Order[0]); 
}); 
0

Sie Einstellung den Wert von GenOrderID in einer Callback-Funktion, die nur einmal ausgeführt wird ein GenerateOrderId Ereignis aufgetreten ist. Der Code innerhalb einer Callback-Funktion wird nicht ausgeführt, bis diese Funktion aufgerufen wird.

Zum Beispiel:

function run(f) { 
    // call `f` after 1 second 
    setTimeout(f, 1000); 
}; 

var foo; 

run(function() { 
    foo = 'bar'; 
    console.log('in callback:', foo); 
}); 

console.log('before callback:', foo); 

// output: 
// before callback: undefined 
// in callback: 'bar' 

An einem gewissen Punkt in der Zukunft, foo werden 'bar' gleich, aber man kann nur weiß dies der Fall nach dem Rückruf aufgerufen wurde. Und Sie können nur wissen, dass Ihr Rückruf von innen aufgerufen wurde.

Verwandte Themen