我有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
不包含第一个对象(仅第二个),YET,data
仅包含第一个对象。 D
是对data
的引用,那么它们如何不同步?
编辑我尝试使用setTimeout()使每个push()
等待,但这不会导致3个案例中的任何一个产生不同的结果。
我认为它不能成为一种竞争条件,因为这会被覆盖,但事情并没有发生。 a:b和y:z缺失。如果是这种情况,a:b或y:z应该仍然存在(以及w:x)。