我有 2 个函数,每个函数都修改传递给它们的参数。
var data = [];
var DoStuff = function( $div , data )
{
var $D = $div;
var D = data;
var socket = $.atmosphere;
var stuff = {
onMessage: function(message)
{ // when a message is asynch. received over websocket
D.push( { "a": "b" } );
D.push( { "y": "z" } );
$D.append( JSON.stringify(D) );
return message;
}
}
this.start = function()
{
var socketStream = socket.subscribe( stuff );
return socketStream;
}
}
$(function(){
var $div = $('#div');
var doStuff = new DoStuff( $div , data );
data.push( { "w": "x" } );
$div.append( JSON.stringify(data) );
var stream = doStuff.start();
});
有时,在一切都说完之后,数组data
包含两个对象:
data: [
{ "w": "x" },
{ "y": "z" }
]
但有时它只包含第一个对象:
data: [
{ "w": "x" }
]
如果我在 上放置断点DoStuff.a return true;
,D
通常包含两个对象。但是大约 10% 的时间,D
不包含第一个对象(仅第二个),YETdata
仅包含第一个。D
是对 的引用data
,那么它们怎么会不同步呢?
编辑我尝试使用 setTimeout() 让每个然后都push()
等待,但这在 3 种情况下都没有导致不同的结果。
我认为这不可能是竞争条件,因为那样的话某些东西会被覆盖,但这并没有发生。a:b 和 y:z 丢失。如果是这种情况,a:b 或 y:z 应该仍然存在(连同 w:x)。