当前位置: 首页 > 面试题库 >

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

欧阳安晏
2023-03-14
问题内容

我知道,在同一句子中使用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的主要原因之一。



 类似资料:
  • 问题内容: 我在页面上添加了一个简单的文件,该文件在和原型中添加了一些非常普通的常见任务功能。 经过反复试验,我发现向,添加任何函数,无论其名称或功能如何都会导致jQuery中的Javascript错误: 罪魁祸首? 我在attr:function {}声明中得到的第1056行的错误: 显然G.replace是未定义的。 很明显,有些事情我只是没有用原型制作而已,但我很痛苦地未能弄清楚它是什么。

  • 问题内容: 如何快速进行异步回调?我正在为我的应用程序编写一个小框架,因为它应该同时在iOS和OS X上运行。因此,我将非特定于设备的主要代码放入该框架中,该框架还处理对我的在线api的请求。很显然,我也希望应用程序的GUI以及ViewController在api请求完成后立即做出反应。在Objective- C中,我通过将包含必须在id变量中调用的函数以及函数本身的视图保存在选择器变量中的视图来

  • 几周前刚开始学Node.js....我不明白为什么“products”数组包含null而不是所需的对象.... 在第13行,当我对对象进行控制台日志记录时,我得到了所需的对象,但我不明白当我在map函数完成它的执行后在第40行对它们进行控制台日志记录时,它们为什么是空的.... 如果数组长度是2(这意味着推入成功),为什么里面存储的对象仍然是空的,而不是我想要存储的对象? 控制台输出 订单模式

  • 问题内容: 我正在从服务器动态加载代码(函数),并将其作为javascript代码执行,然后将其存储在数组中并执行。所有这些代码片段都必须执行一次。伪代码如下 这个问题要复杂得多,但是基本上,如果我发出以下命令 所有这四个将执行并假定它不在数组中,并且所有四个将继续获取代码并执行它。我记得当初学习信号量和互斥量的时候,有没有关于javascript的东西。 问题答案: JavaScript是一种不

  • 问题内容: 我如何才能使此代码返回值 而不冻结浏览器 。 您当然可以用新方法重写它。 编辑: 我需要至少在其他时间从php文件中获取20个变量。 问题答案: 这是不可能的。 Javascript在UI线程上运行;如果您的代码等待服务器回复,则浏览器必须保持冻结状态。 相反,您需要使用回调返回值: 请注意,这两个回调将以不可预测的顺序运行。 您应该修改设计,以便可以在单个AJAX请求中获得所有二十个

  • 问题内容: 我整天都在整理此问题,希望有人能帮助您确定我的问题。我已经使用Ajax在我的应用程序中创建了“异步进度回调”类型的功能。当我将功能剥离到测试应用程序中时,我得到了预期的结果。见下图: 所需功能 当我使用相同的代码将功能绑定到我的单页应用程序中时,出现了一种阻塞问题,其中所有请求仅在最后一个任务完成后才得到响应。在测试应用程序中,所有请求均会依次响应。服务器报告所有请求的状态(“待定”)