Javascript Socket.io-变量未在Socket.on外部更新

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.io和MongoDB。当我第一次向服务器发送我的
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