Socket.io – variables不在socket.on外面更新

我正在使用Socket.io和MongoDB。 当我第一次发送我的socket.emit到服务器,服务器接受参数,并返回我所需的输出。 当我到达client.js上的socket.on时,OrderID显示在控制台上。 然而,当我退出socket.on方法块时, GenOrderIDvariables变得undefined

我的问题是:为什么在socket.on之前创build的socket.on ,不能在外部访问。

这里是我正在使用的client.js

 // 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 

这里是我正在使用的server.js

 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); }); }); }); 

通过在console.log()放置console.log() ,我能够正常工作。

 // 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]); }); 

您正在将一个callback函数中的GenOrderID值设置为一个GenerateOrderId事件发生后才执行。 callback函数内的代码不会运行,直到该函数被调用。

例如:

 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' 

在将来的某个时候, foo将等于'bar' ,但是在你的callback被调用之后,你只能知道这种情况。 而且你只能知道你的callback是从里面调用的。