javascript - Dojo:所有 xhr/ajax 调用似乎都是同步的并阻止其他调用

标签 javascript php ajax dojo

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

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

现在,transferInTimeExec.php 需要一个小时才能运行,这是一个非常复杂的脚本,用于处理招聘公司的每周时间表、处理时间表、进行大量数据库操作等。

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

在“网络”选项卡中 - 第一个是挂起的,您可以看到对不同 Ajax 调用等待的所有后续调用(都有 sync:false)

enter image description here

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

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

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

我的想法已经用完了,也许这里的任何人都可以帮助解决这个问题?是否有用于同步/异步的全局开关?如果不是 ajax 问题,那还能是什么?

最佳答案

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

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

编辑

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

关于javascript - Dojo:所有 xhr/ajax 调用似乎都是同步的并阻止其他调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569807/

相关文章:

javascript - 如何将我的backbonejs View 与jquery结合起来

php - 用户输入验证,客户端还是服务器端? [PHP/JS]

php - 使用 Slim 框架的 REST API 客户端 key

Jquery - 将 event.data 传递给 .on() 和 .bind()

javascript - jQuery/Javascript - X 秒后运行 AJAX 请求

javascript - 调用鼠标悬停回调时的js语法错误

javascript - iframe 显示 MIME 警告 pdfmake : Resource interpreted as Document but transferred with MIME type application/pdf:

javascript - reactjs,常量,传递属性

php - 人们使用 Elasticsearch 做什么?

javascript - Flask-Admin 自定义 Select2 Ajax 字段