0

渡されたパラメーターをそれぞれ変更する 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 とともに)。

4

0 に答える 0