Dojo:所有 xhr / ajax 调用似乎是同步的并阻止其他调用
Dojo: all xhr / ajax calls seem to be synchronous and block other calls
我正在开发我们继承的 CRM。长话短说 - 有一个调用 php 脚本的按钮,它应该在后台 运行,我们不需要等待响应。
request(idata+'transferInTimeExec.php',{
sync: false,
preventCache:true,
method:'GET'
});
现在,transferInTimeExec.php
需要一个小时才能 运行,这是一个非常复杂的脚本,用于处理招聘公司的每周时间表、处理时间表、进行大量数据库操作等。
使用Chrome。每次我按下 运行 按钮时,它都会阻止所有 xhr 调用,直到它完成。 CRM 是 "ajax heavy",而脚本是 运行ning,用户不能做任何事情,如果他们导航到另一个子页面,在我们启动的过程完成之前,不会解析任何 xhr 请求。即使当我打开一个新的浏览器选项卡并尝试做某事时,它也不会这样做。如果我在脚本 运行ning 时在另一个浏览器 (Firefox) 中打开 CRM,我可以使用 CRM。
在“网络”选项卡中 - 第一个处于待处理状态,您可以看到对不同 Ajax 呼叫等待的所有后续呼叫(都有 sync:false)
我什至用 PHP 函数 sleep(30)
替换了整个逻辑,使其在返回任何内容之前 30 秒什么都不做 - 同样的问题。
我在按钮 HTML 标记的 onClick
中尝试了纯 javascript 中的 XHR,而不是 Dojo 方法 - 同样的问题。
我对整个项目进行了残酷的 Search/Replace,将 sync:true
替换为 sync:false
- 没有任何改变。
我 运行 没有想法,也许这里的任何人都可以帮助解决这个问题? sync/async 是否有全局开关?如果不是 ajax 问题还能是什么?
您的脚本 transferInTimeExec.php
可能正在使用会话。在这种情况下,其他 AJAX 调用将不会启动,而是等待此 AJAX 调用完成,以免覆盖会话数据。将 AJAX 调用设置为异步不会更改行为。
如果此脚本需要 1 小时才能完成 运行,那么从 UI 调用它作为 AJAX 是个坏主意。您应该每小时或每天设置一个 Cron,并在后端执行所有操作。当然,如果是使用session的话,还需要对脚本做一些调整。
编辑
您可以在脚本顶部使用 session_write_close();
。这告诉 PHP 此脚本不会向会话写入任何内容,因此其他 AJAX 调用可以免费使用会话。但是注意不要在此之后向 Session 写入任何内容,因为这会导致错误。
我正在开发我们继承的 CRM。长话短说 - 有一个调用 php 脚本的按钮,它应该在后台 运行,我们不需要等待响应。
request(idata+'transferInTimeExec.php',{
sync: false,
preventCache:true,
method:'GET'
});
现在,transferInTimeExec.php
需要一个小时才能 运行,这是一个非常复杂的脚本,用于处理招聘公司的每周时间表、处理时间表、进行大量数据库操作等。
使用Chrome。每次我按下 运行 按钮时,它都会阻止所有 xhr 调用,直到它完成。 CRM 是 "ajax heavy",而脚本是 运行ning,用户不能做任何事情,如果他们导航到另一个子页面,在我们启动的过程完成之前,不会解析任何 xhr 请求。即使当我打开一个新的浏览器选项卡并尝试做某事时,它也不会这样做。如果我在脚本 运行ning 时在另一个浏览器 (Firefox) 中打开 CRM,我可以使用 CRM。
在“网络”选项卡中 - 第一个处于待处理状态,您可以看到对不同 Ajax 呼叫等待的所有后续呼叫(都有 sync:false)
我什至用 PHP 函数 sleep(30)
替换了整个逻辑,使其在返回任何内容之前 30 秒什么都不做 - 同样的问题。
我在按钮 HTML 标记的 onClick
中尝试了纯 javascript 中的 XHR,而不是 Dojo 方法 - 同样的问题。
我对整个项目进行了残酷的 Search/Replace,将 sync:true
替换为 sync:false
- 没有任何改变。
我 运行 没有想法,也许这里的任何人都可以帮助解决这个问题? sync/async 是否有全局开关?如果不是 ajax 问题还能是什么?
您的脚本 transferInTimeExec.php
可能正在使用会话。在这种情况下,其他 AJAX 调用将不会启动,而是等待此 AJAX 调用完成,以免覆盖会话数据。将 AJAX 调用设置为异步不会更改行为。
如果此脚本需要 1 小时才能完成 运行,那么从 UI 调用它作为 AJAX 是个坏主意。您应该每小时或每天设置一个 Cron,并在后端执行所有操作。当然,如果是使用session的话,还需要对脚本做一些调整。
编辑
您可以在脚本顶部使用 session_write_close();
。这告诉 PHP 此脚本不会向会话写入任何内容,因此其他 AJAX 调用可以免费使用会话。但是注意不要在此之后向 Session 写入任何内容,因为这会导致错误。