Javascript Socket.io-变量未在Socket.on外部更新
我正在使用Socket.io和MongoDB。当我第一次向服务器发送我的Javascript Socket.io-变量未在Socket.on外部更新,javascript,node.js,mongodb,sockets,socket.io,Javascript,Node.js,Mongodb,Sockets,Socket.io,我正在使用Socket.io和MongoDB。当我第一次向服务器发送我的socket.emit时,服务器接收参数并返回所需的输出。当我到达client.js上的socket.on时,OrderID将显示在控制台上。然而,当我退出套接字时,方法块上的GenOrderID变量变为undefined 我的问题是:为什么在套接字之前创建的变量在之外不再可访问 下面是我正在使用的client.js: // Create order array var Order = []; // Create Gene
socket.emit
时,服务器接收参数并返回所需的输出。当我到达client.js上的socket.on
时,OrderID将显示在控制台上。然而,当我退出套接字时,
方法块上的GenOrderID
变量变为undefined
我的问题是:为什么在
套接字之前创建的变量在之外不再可访问
下面是我正在使用的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
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);
});
});
});
下面是我正在使用的server.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
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()
放在socket.on上的
// 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]);
});
您正在回调函数中设置GenOrderID
的值,该值仅在GenerateOrderId
事件发生后执行。回调函数内部的代码在调用该函数之前不会运行
例如:
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'
,但您只能知道调用回调后的情况。您只能知道您的回调是从内部调用的。您的变量可以在外部访问,但是您的console.log()
在socket.on()
之前触发,这是一种异步机制。@dvlsg因此console.log()
在socket.on()之外
之后是否触发?此操作的一般流程(很可能)是:客户端发出,客户端设置。on()
回调,客户端控制台。log()
激发,服务器接收生成OrderId
,服务器发出生成OrderId
,客户端接收生成OrderId
,客户端设置GenOrderID
——但是console.log()
早就在这一点上完成了。如果你还没有阅读,你可以试着阅读。这不完全是您在这里使用的(更像是一个EventEmitter),但总体概念是相同的。@dvlsg感谢您简化了流程!我刚刚将console.log()
移动到socket.on