【发布时间】:2019-04-24 11:08:58
【问题描述】:
我有一种情况,当我在 php 页面中单击按钮时调用 js 函数,会显示一个隐藏的对话框,并且在发出一系列生成 SQL 语句的同步 ajax 调用之前在对话框中绘制一些数据服务器端。这个过程可能会在一个循环中重复,这是同步 ajax 的原因,因为如果 ajax 调用返回某种错误,则需要中断循环。
我的问题是 Chrome 不会在 ajax 调用之前显示数据,而 firefox 会。我尝试将 jqXHR 对象的 contentType 方法设置为“application/octet-stream”,但没有成功。
这里是 ajax 代码:
$.ajax({
async : false,
url : "url",
method : "GET", // redudntant, GET is the default
dataType : "text",
beforeSend : function(xhr) {
xhr.overrideMimeType("application/octet-stream;");
},
success : function(data) {
// do stuff with data
}
}).fail(function(xhr, status, error) {
// do stuff with error
});
【问题讨论】:
-
这个过程可能会在一个循环中重复,这是同步 ajax 的原因,因为如果 ajax 调用返回某种错误,则需要中断循环。嗯?异步调用可以中止,并且可以有
error回调。 -
对,但正如我所指出的,ajax 调用必须在循环重复之前返回其数据。不仅如此,用户也不知道发生了什么,因为 chrome 不允许显示任何内容。服务器端进程可能需要一些时间才能完成,所以我需要展示一些东西,否则他会认为它被冻结了。 Firefox 不这样做。我添加到 div 的 innerHTML 的任何内容都会立即出现。
-
所以,根本不要使用循环。使用常规的异步 AJAX 调用并将循环代码分离到它自己的函数中。然后,在成功回调中,调用曾经是循环体的函数。然后,浏览器不会变得无响应,并且在前一个任务完成之前您不会执行下一个任务。
-
很好的建议,但它没有回答问题的要点:为什么 chrome 的行为与 firefox 不同?是否由于缓冲(我在某处读到 chrome 在显示前缓冲 1K),如果是这样,如何克服?在我重构我的逻辑之前,我想要一个答案。
标签: javascript ajax google-chrome firefox mime-types