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);
});
});
});
Ihre Variablen sind außerhalb zugänglich, aber Ihre 'console.log()' feuert vor 'socket.on()', was ein asynchroner Mechanismus ist. – dvlsg
@dvlsg Also die 'console.log()' 's außerhalb der' socket.on() 'feuern danach? –
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