【问题标题】:"atomic" operation desturbed by asynchronous ajax callbacks受异步 ajax 回调干扰的“原子”操作
【发布时间】: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


    【解决方案1】:

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

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

    另见:

    【讨论】:

    • 谢谢!刚才我的脸很用力,在意识到我在两者之间发出警报后,导致回调触发。
    【解决方案2】:

    Javascript 完全是单线程的。

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

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

    【讨论】:

    • 没有人谈论 Javascript 线程安全是有原因的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2014-08-27
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多