【问题标题】:Global variables and asynchronous data全局变量和异步数据
【发布时间】:2013-08-13 00:37:40
【问题描述】:
我的全局变量n有问题:
var n ;
socket.on('connect', function(){
socket.on('news', function (mensaje) {
n = mensaje.data;
$('#string').val(n); // show data
});
$('#string1').val(n); // I can't see anything, why?
...});
//
首先,我的全局变量 n 只显示在 socket.on 内部,但我希望它显示该函数。
【问题讨论】:
标签:
javascript
sockets
websocket
global-variables
【解决方案1】:
问题是当有问题的行执行时,socket.on 没有完成(或调用回调)。这是因为on 是一个异步 操作:它立即 返回并在接收到数据时“稍后”调用回调。数据只能在运行on 回调后使用。
这里是一个执行顺序的例子,其中1在2之前“运行”,在3之前等等:
// 1
var n;
socket.on('connect', function(){
// 2
socket.on('news', function (mensaje) { // "on callback"
// 4
n = mensaje.data;
// 5
$('#string').val(n);
});
// 3 - note that this occurs *before* 4 & 5
// which run in the asynchronous callback
// so n has not been assigned yet
$('#string1').val(n);
})
解决方案是仅在变量被赋值后使用,只有在on 回调运行后才能保证。 (Promise 使得链接一堆依赖的异步操作变得非常容易。)