异步 ajax 回调导致的"atomic"操作



我知道,在同一个句子中使用JavaScript和'atomic'这两个词有点奇怪,因为JavaScript被认为是异步的,因此不是很原子。

//编辑这是我的错误!通过警报的关闭(并在chrome中隐藏进一步的警报),它迅速中断,让其他代码飞。JavaScript是单线程的。

快速答题;在哪种情况下,我们从异步回调中断保存,我们如何防止他们的某些代码块?

Long -> My Scenario;我的整个应用程序都是递归的,触发了许多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。我知道,我只要取消数组字段的设置,我的索引问题就解决了。但这不是我想要的,因为我正在序列化这些信息,不希望有百分之百的空项。我的目标是找到一种解决这种情况的通用方法:)

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

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

参见:

  • 是否有任何原子javascript操作来处理ajax的异步性质?

Javascript完全是单线程的

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

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

最新更新