渡されたパラメーターをそれぞれ変更する 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
、最初のオブジェクト (2 番目のみ) がdata
含まれず、最初のオブジェクトのみが含まれます。D
は への参照data
です。
編集setTimeout() を使用してそれぞれを待機させ、次に両方をpush()
待機させようとしましたが、3つのケースのいずれでも異なる結果は発生しませんでした。
何かが上書きされるため、競合状態にはなり得ないと思いますが、それは起こっていません。a:b と y:z がありません。その場合、a:b または y:z のいずれかがまだ存在している必要があります (w:x とともに)。