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不包含第一个对象(仅第二个),YETdata仅包含第一个。D是对 的引用data,那么它们怎么会不同步呢?

编辑我尝试使用 setTimeout() 让每个然后都push()等待,但这在 3 种情况下都没有导致不同的结果。

我认为这不可能是竞争条件,因为那样的话某些东西会被覆盖,但这并没有发生。a:b 和 y:z 丢失。如果是这种情况,a:b 或 y:z 应该仍然存在(连同 w:x)。

4

0 回答 0