Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript事件处理程序/requestAnimationFrame数据竞赛_Javascript_Jquery_Arrays_Jquery Events_Requestanimationframe - Fatal编程技术网

Javascript事件处理程序/requestAnimationFrame数据竞赛

Javascript事件处理程序/requestAnimationFrame数据竞赛,javascript,jquery,arrays,jquery-events,requestanimationframe,Javascript,Jquery,Arrays,Jquery Events,Requestanimationframe,我有两段代码。一个是requestAnimationFrame循环,循环遍历数组,对每个元素进行一些计算,然后渲染场景。我还有一个按钮的事件处理程序,用于修改数组的状态(删除一些元素)。这两块看起来像这样: function update(delta) { var to_remove = []; for (var i = 0; i < arr.length; i++) { // Computations if (cond) {

我有两段代码。一个是
requestAnimationFrame
循环,循环遍历数组,对每个元素进行一些计算,然后渲染场景。我还有一个按钮的事件处理程序,用于修改数组的状态(删除一些元素)。这两块看起来像这样:

function update(delta) {
    var to_remove = [];
    for (var i = 0; i < arr.length; i++) {
        // Computations
        if (cond) {
            to_remove.push(i);
        }
    }
    for (var j = 0; j < to_remove.length; j++) {
        // This is where the error occurs, since j has been deleted.
        arr[j].some_field = null;
        arr.shift(j, 1);
    }
}
function render() {
    requestAnimationFrame( render );
    var new_time = Date.now();
    update(new_time - last_time);
    last_time = new_time;
    // Render scene
}
render();

时不时我会遇到类似于数据竞赛的情况:我会在尝试删除数组中的越界索引时出错,这使我认为它已被删除,并且
requestAnimationFrame
正在事件处理程序的单独线程中运行,因此这两个线程正在访问相同的数据。有谁能证实/否认这一点,或者建议我如何避免这些数据竞争?

在第二个循环中尝试使用
var j
,而不是两次声明
i
update(Math.min(17,new_time-last_time))是什么意思也更新函数不接受代码中的参数。更新它以避免混淆为什么要删除++i?更新为使用j,更新只需要一个时间增量,更新它++我避免了i++所做的复制。可能没关系,但我已经习惯了C++。事件处理程序代码在哪里?在第二个循环中尝试使用<代码> var j/COD>而不是声明<代码> I/Cuth>两次……你的意思是<代码>更新(Maul.Min(17,NeXiTime- LaSTiTimeTimes));<代码>也更新函数不接受代码中的参数。更新它以避免混淆为什么要删除++i?更新为使用j,更新只需要一个时间增量,更新它++我避免了i++所做的复制。可能没关系,但我已经习惯了C++。事件处理程序代码在哪里?
$("#my_button").click(function () {
    arr[j].some_field = null;
    arr.shift(i, 1);
});