我知道,在同一句子中使用JavaScript和’atomic’一词有点奇怪,因为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); ... }
我只是简单地再次搜索索引,然后直接将其剪掉。
我的一般问题是,在哪种情况下可以从异步回调中断中保存代码,如何防止某些代码块使用它们?
我的具体问题是,从理论上讲,是否可以 在 返回索引的indexOf函数和将数组切分的splice函数 之间 调用ajax回调。
谢谢您的帮助
ps我知道,我只需取消设置数组字段即可解决索引问题。但这不是我想要的,因为我正在序列化该信息,并且不希望有100个空条目。我的目标是找到一种解决此类情况的一般方法:)
JavaScript本质上是单线程的。这意味着,如果AJAX响应到达或应触发超时/间隔但其他代码正在运行,则响应回调/超时将 等待 。
这是为node.js选择JavaScript的主要原因之一。