Socket.IO节点js将数据保存到客户端

时间:2016-11-10 13:11:26

标签: javascript node.js socket.io

目前我想将从服务器分配的int保存到我的客户端

服务器端:

socket.emit('clientId', id);

客户端:

var clientId;
socket.on('clientId', function(data){
     clientId = data;
});

但是,当我使用console.log(clientId)时;在函数外部,它变得不确定。这个问题有方法解决吗。感谢

2 个答案:

答案 0 :(得分:1)

并不是在函数之外变得未定义,但它很可能尚未定义。您没有在函数外部显示您想要如何访问它,但如果它是这样的:

var clientId;
socket.on('clientId', function(data){
     clientId = data;
});
console.log(clientId);

然后console.log行将在clientId = data之前运行,因此它是同一个变量,它尚未定义。

您需要从socket.on处理程序或该处理程序运行的某个函数访问该变量,或者在该处理程序运行之后访问该变量。

很难说出更具体的内容,因为你没有说你想如何访问变量以及你想用它做什么。你可以看到我放在GitHub上的那个做类似的东西的例子,看看它是否对你有帮助:

看起来像这样:

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening socket.io connection');
var s = io();
s.on('connect_error', function (m) { log("error"); });
s.on('connect', function (m) { log("socket.io connection open"); });
s.on('message', function (m) { log(m); });

这里,从处理程序中调用log函数,以便在消息传递完成后保证调用它。数据作为参数传递给该函数,但它也可以使用全局变量。

更新

这是一个更简单的例子:

var clientId;
socket.on('clientId', function (data) {
     clientId = data;
     clientReady();
});

function clientReady() {
    // you can access it here:
    console.log(clientId);
}

在这里,您可以在clientReady函数中访问您的变量,该函数位于on处理程序之外。可以想象它就像window.onload处理程序一样:

window.onload = function() {
    // ...
};
jQuery中的

$(document).ready()

$(document).ready(function () {
    // ...
});

这是一段代码,在某个时刻被调用以保证您需要的所有内容都已准备就绪。

使用承诺的另一个例子:

var clientIdPromise = new Promise(function (resolve, reject) {
    socket.on('clientId', function (data) {
        resolve(data);
    });
});

// now everywhere in your code you can access it as:
clientIdPromise.then(function (clientId) {
    // you have access to clientId here
});

或更短,使用胖箭头符号:

var clientIdPromise = new Promise(
    (res, rej) => socket.on('clientId', data => res(data));

// and somewhere else:
clientIdPromise.then(clientId => {
    // you have access to clientId here
});

答案 1 :(得分:0)

JavaScript是异步的,只有在调用.on('clientId')事件后才会打印实际值。你应该console.log在函数内部或之后,但是使用EventEmitter。