Javascript Dojo:所有xhr/ajax调用似乎都是同步的,并且会阻止其他调用

Javascript Dojo:所有xhr/ajax调用似乎都是同步的,并且会阻止其他调用,javascript,php,ajax,dojo,Javascript,Php,Ajax,Dojo,我正在从事我们继承的CRM。长话短说——有一个按钮可以调用php脚本,该脚本应该在后台运行,我们不需要等待响应 request(idata+'transferInTimeExec.php',{ sync: false, preventCache:true, method:'GET' }); 现在,transferInTimeExec.php需要一个小时才能运行,它是一个非常复杂的脚本,用于处理招聘公司的每周时间表,处理它们,执行大量数据库操作等 使用铬。每次我按下按钮运

我正在从事我们继承的CRM。长话短说——有一个按钮可以调用php脚本,该脚本应该在后台运行,我们不需要等待响应

request(idata+'transferInTimeExec.php',{
    sync: false,
    preventCache:true,
    method:'GET'
});
现在,
transferInTimeExec.php
需要一个小时才能运行,它是一个非常复杂的脚本,用于处理招聘公司的每周时间表,处理它们,执行大量数据库操作等

使用铬。每次我按下按钮运行它,它都会阻止所有xhr调用,直到它完成为止。CRM是“重ajax”的,当脚本运行时,用户不能做任何事情,如果他们导航到另一个子页面,在我们启动的流程完成之前,不会解析任何xhr请求。即使我打开一个新的浏览器选项卡并尝试执行某些操作,它也不会执行。如果在脚本运行时在另一个浏览器(Firefox)中打开CRM,则可以使用CRM

在Network选项卡中,第一个是挂起的,正如您所看到的,对不同Ajax调用的所有后续调用都在等待(所有调用都有sync:false)

我甚至用PHP函数
sleep(30)
替换了整个逻辑,使其在返回任何内容之前30秒内不做任何操作-同样的问题

我在纯javascript中尝试了XHR,在按钮HTML标记上的
onClick
,而不是Dojo方法中——同样的问题

我对整个项目进行了残酷的搜索/替换,将
sync:true
替换为
sync:false
——没有任何更改


我已经没有主意了,也许这里的任何人都能帮我解决这个问题?是否有用于同步/异步的全局交换机?如果不是ajax问题,还有什么问题呢?

您的脚本
transferInTimeExec.php
可能正在使用会话。在这种情况下,其他AJAX调用将不会启动,而是等待此AJAX调用完成,以避免覆盖会话数据。将AJAX调用设置为asynchronous不会改变行为

如果这个脚本需要1小时才能运行,那么从UI中将其称为AJAX是个坏主意。您应该每小时或每天设置一个Cron,并在后端执行所有操作。当然,如果脚本正在使用会话,则需要对脚本进行一些调整

编辑


您可以使用
session\u write\u close()位于脚本顶部。这告诉PHP该脚本不会向会话写入任何内容,因此其他AJAX调用可以自由使用该会话。但是,请注意不要在此之后向会话写入任何内容,因为这将导致错误。

请求函数是调用“请求”库还是自定义实现?如果它是客户的话,你能把代码包括进来吗?我认为它可能使用异步/await而不是异步执行。你检查了吗?@TomNijs-这是PHP中的会话问题。请求方法是一个Dojo方法,没有修改。它正在使用会话,因为它需要在会话中存储两个变量。我不知道这个机制。我将尝试一个黑客修复程序,首先获取这些变量,然后调用实际脚本,而不必使用会话本身。我马上回来报告。我知道最好运行cron,但这必须是“按按钮”。我可以在数据库中放置一个bool并每分钟运行cron,但实际上只有当bool是
true
时才运行,但这是他们不会付钱给我的,因为它超出了范围…从浏览器的角度来看,会话只是一个cookie,我不认为它与同步请求的行为有关@会计م这与浏览器无关。这是由PHP引起的。看看这个@哦,我明白了,所以请求被触发了,但服务器没有响应?我认为浏览器正在阻止请求(根本没有将它们发送到服务器,等待第一个响应),是吗?是的。根据OP,完成脚本大约需要1小时。所以浏览器正在等待。由于它是一个会话问题,OP能够在另一个浏览器中打开网站,并且在那里工作正常。