【发布时间】:2011-11-30 22:01:02
【问题描述】:
我知道,在同一个句子中使用 JavaScript 和“原子”这两个词有点奇怪,因为 JavaScript 被认为是异步的,因此不是很原子。
//编辑 这是我这边的一个错误!通过让警报消失(并在 chrome 中隐藏更多警报),它迅速中断并让其他代码飞起来。 JavaScript 是单线程的。
快速 -> 实际问题; 在什么情况下我们会从异步回调中断中保存,我们如何才能在某些代码块中阻止它们?
长篇 -> 我的场景; 我的整个应用程序是非常递归的,并且会触发许多 ajax 请求,在返回时会触发更多可能触发更多 ajax 请求的递归函数。 在我的代码中,我对数组有一些非常关键的操作,必须在下一个操作发生之前完成(不过是简单的推送/拼接逻辑)。
我遇到了一个问题,我在数组中获取了键的索引并将其保存在变量中。然后我将它与 -1 进行比较,如果它是真的,我从数组中拼接(不仅仅是取消设置)元素。 现在,在获取索引和拼接之间,异步回调返回结果并开始递归的东西,然后通过添加/删除更多项目(并弄乱我之前得到的索引值)来改变数组。
这是旧代码;
if ( this.dataset && (index=this.dataset.children.indexOf(child.key) )!==-1 ){
console.log("removed from dataset!");
//<=== AJAX Call Returns and adds/removes items from the array
this.dataset.children.splice(index, 1); //goes bad, because index not good anymore
...
}
这是“工作”但未优化的代码
if ( this.dataset && (index=this.dataset.children.indexOf(child.key) )!==-1 ){
console.log("removed from dataset!");
//<=== AJAX Call Returns and adds/removes items from the array
//Problem solved, since I'm getting the index again
this.dataset.children.splice(this.dataset.children.indexOf(child.key), 1);
...
}
我只是简单的再次搜索索引,直接拼接掉。
我的一般问题是,在什么情况下我们可以从异步回调中断中保存,我们如何防止某些代码块出现这些中断?
StackOverflowers 的同胞,我的具体问题是,如果理论上,ajax 回调可以在在返回索引的 indexOf 函数和切割数组的拼接函数之间调用。
感谢您的帮助
p.S 我知道,我只需取消设置数组字段,我的索引问题就会得到解决。但这不是我想要的,因为我正在序列化该信息并且不想要百分之一的空条目。找到解决这种情况的一般方法是我的目标:)
【问题讨论】:
标签: javascript ajax asynchronous transactions atomic