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);
});