目前我想将从服务器分配的int保存到我的客户端
服务器端:
socket.emit('clientId', id);
客户端:
var clientId;
socket.on('clientId', function(data){
clientId = data;
});
但是,当我使用console.log(clientId)时;在函数外部,它变得不确定。这个问题有方法解决吗。感谢
答案 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。