Socket.io - 变量未更新外socket.on

时间:2016-07-07 19:21:24

标签: javascript node.js mongodb sockets socket.io

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

我的问题是:为什么在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);
        });
    });
});

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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',但您只能知道在您的回调被调用后就是这种情况。并且你只能知道你的回调是从它内部调用的。