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

qnzebej0  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(194)

我正在对我们继承的CRM工作。长话短说-有一个按钮,调用PHP脚本应该在后台运行,我们不需要等待响应。

request(idata+'transferInTimeExec.php',{
    sync: false,
    preventCache:true,
    method:'GET'
});

现在,transferInTimeExec.php需要运行一个小时,这是一个非常复杂的脚本,它处理招聘公司的每周时间表,处理它们,执行大量的数据库操作等。
使用Chrome。每次我按下按钮运行它,它都会阻止所有的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 的问题,还能是什么?

jv2fixgn

jv2fixgn1#

您的脚本transferInTimeExec.php可能正在使用会话。在这种情况下,其他 AJAX 调用将不会启动,而是等待此AJAX调用完成,以免覆盖会话数据。将AJAX调用设置为异步不会更改行为。
如果这个脚本需要1个小时来运行,那么从UI中调用 AJAX 是一个坏主意。你应该设置一个Cron,每小时或每天,并在后端执行所有的操作。当然,如果它使用会话,你需要对脚本做一些调整。

编辑

你可以在脚本的顶部使用session_write_close();。这告诉PHP这个脚本不会向Session写入任何东西,所以其他 AJAX 调用可以自由使用Session。但是要注意,在此之后不要向Session写入任何东西,因为这会导致错误。

相关问题