Socket.io – variables不在socket.on外面更新
我正在使用Socket.io和MongoDB。 当我第一次发送我的socket.emit
到服务器,服务器接受参数,并返回我所需的输出。 当我到达client.js
上的socket.on
时,OrderID显示在控制台上。 然而,当我退出socket.on
方法块时, GenOrderID
variables变得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是从里面调用的。