ExtJS4-如何检查当前所有ajax请求是否已完成,然后执行操作?

ExtJS4-如何检查当前所有ajax请求是否已完成,然后执行操作?,ajax,extjs,recursion,extjs4,loading,Ajax,Extjs,Recursion,Extjs4,Loading,我有一个页面,在服务器端激发Ajax验证请求。我需要在所有ajax请求完成加载或完成后执行一个操作 为此,我以以下方式在递归函数中使用Ext.Ajax.isLoading(): function chechValid(){ if(Ext.Ajax.isLoading()){ checkValid(); }else{ //Code for Action 1 } }//EOF checkValid(); //Code for Action

我有一个页面,在服务器端激发Ajax验证请求。我需要在所有ajax请求完成加载或完成后执行一个操作

为此,我以以下方式在递归函数中使用Ext.Ajax.isLoading():

function chechValid(){
    if(Ext.Ajax.isLoading()){
        checkValid();
    }else{
        //Code for Action 1
    }
}//EOF

checkValid();

//Code for Action 2
问题是,当我这样做时,浏览器会出现以下错误:

Mozill FF-递归太多

IE-第18134行的堆栈溢出

如果这种递归对于浏览器来说是一件很繁重的事情,那么当所有Ajax请求都加载完毕后,如何执行任务呢

使用延迟不是我想要的,因为如果使用延迟,那么浏览器开始执行其他代码(如上面共享的“操作2代码”),这不是预期的

其主要目的是浏览器不应该执行任何操作,除非所有Ajax请求都已完成,并且一旦完成,浏览器就应该执行特定的操作

这方面有什么建议/帮助吗

提前谢谢

PS:使用ExtJS4.0.7

(更新)有关实际情况的更多详细信息:-

下面是对所面临情况的简要描述——有一个表单,我需要在其中对各个字段执行服务器端验证。我是通过对blur事件触发ajax请求来实现的。根据在blur上激发的验证Ajax的服务器响应,字段被标记为无效,不允许表单提交。(避免“更改”事件,因为这会由于大量Ajas请求而在服务器上造成大量开销,并且在接收到来自各种此类Ajax请求的响应时还会对字段产生波动性影响)

除了一种情况外,一切正常——当用户修改字段的值,而不是从字段中弹出“选项卡”时,她直接单击“保存”按钮。在这种情况下,虽然会触发blur事件,但“Save”的处理不会等待Ajax验证响应并提交表单。因此,我需要检查Ajax请求是否完成了加载和表单保存过程。很遗憾,requestComplete在这里不起作用。如果尝试使用递归,那么当然,浏览器会因为资源的高使用率而挂起。如果我尝试使用暂停脚本来解决问题(此处共享-),也会出现同样的情况

这个有什么可能的解决办法吗


TIA

您的方法将导致无限递归

更好的方法是在
Ext.Ajax.requestcomplete
中注册回调函数,类似这样(未测试):

})

Ext.Ajax.request()在调用时返回一个事务对象,它是唯一的,允许您识别和中止特定的Ajax请求

通过在没有指定事务对象的情况下调用Ext.Ajax.isLoading(),它默认为最后一个请求,这就是为什么此时必须递归调用它的原因

如果是我,我会在启动这些事务对象时创建它们的数组,并将它们作为可选参数传递给Ext.Ajax.isLoading()函数,以检查特定请求是否已完成。如果有,您可以从数组中删除该事务对象,并且只有在数组为空时才进行保存


这将解决您的递归问题,因为您等待的请求数量总是有限的。

除非我误解了这个问题,否则您不能创建几个全局请求。我知道globals是不好的,但在这种情况下,它会帮你省去不少头痛。一个全局变量是“formReady”,最初将其设置为false,另一个全局变量是“ajaxActive”,并设置为false。您还将添加一个onSubmit方法,该方法将验证“formReady”是否为true,如果未通知用户正在进行验证(或者您可以再次设置表单提交的超时时间,并进行第二次验证,以检查“ajaxActive”是否为true)。在进行AJAX调用时,它会将变量“ajaxActive”设置为true,一旦完成,就会将formReady设置为true。如果AJAX的响应是表单良好,您还可以自动重新提交表单。

如果投票被否决,请添加评论。这将有助于改善问题中缺失的内容。谢谢。在评估这些内容之后,我发现这与在Javascript中使用sleep函数的旧需求是一样的:),正如这里所讨论的——以及在许多其他地方。我想知道,虽然JS是一种单线程语言,但是考虑到Ajax的存在,如果需要的话,是否应该提供这样的功能来暂停JS中的内容呢?在请求完成事件中编写代码可能并不总是达到上述情况下的目的。谢谢您的帖子Eivind。不幸的是,我所面临的情况(在上述问题中添加了详细信息)并不适合这种情况。在这种情况下有什么可行的解决办法吗?再次感谢你,谢谢丹尼尔。这是有用的信息。但同样,主要问题归根结底是“只有在数组为空时才进行保存”——我应该如何强制JS引擎等待数组为空,然后执行保存功能?我猜这将再次要求递归,并将导致与我在问题中共享的相同错误。啊,我理解-因此您不希望用户再次提交表单;这不是你的标准表单验证。我想这就是您可以将requestComplete()与此解决方案结合使用的地方-您的requestComplete()函数可以包含一个检查,以查看从数组中删除给定请求后数组是否为空。如果是,则继续保存调用。这可能是一个可行的解决方案,但情况是我需要在“行编辑”插件的“validateedit”事件中执行此签入。正是这个事件触发Ajax进行检查,它需要返回fa
if (Object.keys(Ext.Ajax.requests).length === 0) console.log("No active requests");
if (Object.keys(Ext.Ajax.requests).length === 0) console.log("No active requests");