“原子”操作受到异步ajax回调的干扰

时间:2011-11-30 22:01:02

标签: javascript ajax asynchronous transactions atomic

我知道,使用JavaScript和'atomic'这两个词 - 同一个句子中的任何内容都有点奇怪,因为JavaScript被认为是异步的,因此不是非常原子的。

// EDIT 这是我的错误!通过让警报响起(并在Chrome中隐藏更多警报),它很快就会中断并让其他代码飞起来。 JavaScript是单线程的。

快速 - >实际问题; 我们在哪种情况下从异步回调中断中保存,我们如何防止它们出现在某些代码块中?

长 - >我的情景; 我的整个应用程序非常递归并触发了许多ajax请求,返回时会触发更多可能触发更多ajax请求的递归函数。 在我的代码中,我在一个数组上有一些非常关键的操作,必须在下一个操作发生之前完成(尽管简单的push / splice逻辑)。

我遇到了问题,我在数组中得到了一个键的索引并将其保存在变量中。然后我把它比作-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我知道,我只是可以取消设置数组字段,我的索引问题就可以解决了。但这不是我想要的,因为我正在序列化这些信息并且不想要百分之百的空条目。找到如何解决这种情况的一般方法是我的目标:)

2 个答案:

答案 0 :(得分:7)

JavaScript本质上是单线程的。这意味着如果AJAX响应到达或者应该触发超时/间隔但其他代码正在运行,则响应回调/超时将等待

这是为node.js选择JavaScript的主要原因之一。

另见:

答案 1 :(得分:2)

Javascript完全是单线程的。

异步回调只能在没有其他代码使用消息队列运行时运行,如Windows消息 所有代码都在UI线程上运行,您的代码永远不会在中间被中断(除了无响应脚本警告)

请注意,Javascript支持使用HTML5 Web Workers实现真正的多线程。