一尘不染

异步ajax回调破坏了“原子”操作

ajax

我知道,在同一句子中使用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个空条目。我的目标是找到一种解决此类情况的一般方法:)


阅读 203

收藏
2020-07-26

共1个答案

一尘不染

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

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

2020-07-26