4

我正在使用 jQuery ajax() 方法将(GET)数据传递到另一个 ExportData 页面,并在该页面处理后获取返回的数据(“成功/失败”)。ExportData 页面在返回“成功/失败”之前大约需要 10 秒。

我使用的代码在其他浏览器(FF/IE/Chrome)中运行良好,但在 Safari 中却不行。在 Safari 的代码检查器中,显示的状态代码是 -1001,并且没有收到任何数据。虽然还有其他 ajax() 请求(只要此页面返回数据就不需要)并且它们确实有效(状态为 200)。

我猜测发送和接收数据之间的长时间间隔会导致 Safari 出错。但是我也发现 -1001 错误显示得非常快,这可能意味着 ExportData.php 没有执行。

有人知道这个问题吗?对你的帮助表示感谢!

代码是:

ExportData: function (date,view) {
    ajaxcall.data = {};
    ajaxcall.url = 'ExportData.php?Date='+date+'&View='+view;
    ajaxcall.callbackfunction = UserEvents.ExportSuccess;
    ajaxcall.Call();
},

“ajaxcall”在另一个文件中:

var ajaxcall = {
    SitePath: '',
    data: '',
    url: '',
    callbackfunction: '',
    fileElementClass: '',
    AjaxRequest: false,
    callback: true,
    Call: function () {
        if (ajaxcall.AjaxRequest == true) {
            alert(ajaxcall.AjaxRequest);
            return;
        }
        else {
            try {
                ajaxcall.AjaxRequest == true;
                $.ajax({
                    type: "GET", 
                    url: ajaxcall.url,
                    data: ajaxcall.data,
                    dataType: "json",
                    async: false,
                    success: function (data) {
                            if (ajaxcall.callback == true) {
                                ajaxcall.callbackfunction(data);
                            }
                    },
                    error: function (request, status, error) {},
                    complete: function () {
                        ajaxcall.AjaxRequest = false;
                    }
                });
            }
            catch (e) {
                ajaxcall.AjaxRequest == false;
            }
        }
    },
};

谢谢,肖恩刘

4

2 回答 2

6

这是一个老问题,我不确定你是否找到了答案,但我们最近遇到了同样的问题。经过大量研究和测试,我们发现 Safari 会忽略同步 AJAX 调用的超时设置,限制为 10 秒。我想这被认为是用户体验的事情,因为同步调用会使页面看起来挂起,并且他们可能会认为长时间这样做不是用户友好的,或者是无响应的页面。

因此,您基本上有两个选择,您可以修改代码以使用输出缓冲区定期发回数据。这应该会触发 Safari 识别该请求至少处于活动状态并做出响应,并且通常不会强制它超时。我们从未尝试过,所以我不能保证,但我在这里和那里看到了一些不同的成功故事。另一种选择是将 AJAX 调用更改为异步调用。这可能是更简单的方法,但如果您的应用程序依赖于同步调用,您可能需要实现一些承诺来“模拟”同步响应。

作为参考,这里是我们开始追踪问题的地方:http ://propercode.com/wordpress/?p=32 。

于 2014-03-31T16:33:40.337 回答
1

Try setting a timeout in your settings object.

Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.

于 2012-08-29T12:50:14.453 回答