iPhone Safari上的ajax调用不会返回

时间:2013-07-16 18:58:43

标签: jquery mobile-safari

我正在使用jQuery 1.9.1,并且有一个问题似乎只是间歇性地发生在移动版Safari上。

  1. 点击按钮,调用FB.login,在移动版Safari上弹出一个新页面并要求用户登录FB。然后该页面关闭,控制权返回到上一页。
  2. 当FB.login返回时,获取id和访问令牌,并对我们的API /后端服务器进行ajax调用尝试登录
  3. 登录调用API返回,如果响应成功,重定向到主页,如果响应是“用户不存在”,则呈现创建帐户页面
  4. 问题是对API服务器的调用。大部分时间都很好,但是20%到30%的时间都失败了。

    失败意味着   - 没有ajax完成/失败/总是被调用   - 也试过成功/错误/完成,不叫做

    我在服务器端看到请求,服务器返回。它可能是超时问题,但服务器通常返回非常快(低于100毫秒)。

    而且这只发生在移动版Safari上。似乎更有可能在较旧的iOS(5,6.0,6.1.2)和最新的6.1.4。

    我也尝试过jQuery 1.10.2和2.0.3,并遇到了同样的问题。

    有没有人有类似的问题?

    代码示例

        $.ajax({
            type: 'POST',
            cache: false,
            url: gem.conf.apiUrls.user_login_facebook,
            data: JSON.stringify(data),
            dataType: 'json',
            contentType: 'application/json',
            beforeSend: gem.auth.set_request_headers
        }).done(function(data, textStatus, jqXHR) {
            gem.utils.log.debug("gem.auth.login_facebook_impl: ajax done");
        }).fail(function(data, textStatus, jqXHR) {
            gem.utils.log.debug("gem.auth.login_facebook_impl: ajax fail");
        }).always(function(data, textStatus, jqXHR) {
            gem.utils.log.debug("gem.auth.login_facebook_impl: ajax always");
        });
    

2 个答案:

答案 0 :(得分:0)

这似乎是一个超时问题,一旦我指定了显式超时(2.5秒),事情就会很好。我还清理了周围的代码,但我不认为它们与这个不返回的ajax有关。

答案 1 :(得分:0)

如果可以,请尝试将请求类型从“发布”切换为“获取”。这为我解决了这个问题。我在$ .when中发出一堆帖子请求,而.done会在safari手机上间歇性地发射。可能是因为前面提到的超时问题。我将请求类型切换为'get',一切正常。