【问题标题】:Synchronous Ajax Timeout in webviewwebview中的同步Ajax超时
【发布时间】:2013-09-12 10:56:56
【问题描述】:

在 Andriod 中从 webview 向跨域网站执行从 javascript 到跨域网站的同步 ajax 请求 (GET) 时,请求失败。 代码如下,

  var jqxhr = $.ajax({
    url: url,
    cache: false,
    dataType: 'json',
    type: 'GET',
    async: false
  })
  .done(function ( data ) { fnSuccess(JSON.stringify(data)); });

  jqxhr.fail(function(jqXHR, textStatus, errorThrown) {
    alert("Failed with:"+textStatus+"--"+errorThrown+"--"+jqXHR.status+"--"+jqXHR.responseText);
  });

网站应该以 JSON 格式向我返回数据,平均响应时间约为 90 秒。 网址是https://abc.com/abc/123?a=1&b=2&c=3

Ajax 请求启动时显示以下日志(adb logcat), E/WebUrlLoaderClient(924):第0次尝试10秒后同步请求超时,URL:https://abc.com/abc/123?a=1&b=2&c=3 E/WebUrlLoaderClient(924):第一次尝试10秒后同步请求超时,URL:... E/WebUrlLoaderClient(924):第二次尝试10秒后同步请求超时,URL:...

记录第 3 行后,ajax 请求将就绪状态更改为 4,响应状态更改为 0 而不是 200,响应文本也为空。这意味着它在 30 秒后超时(3 次重试,每次 10 秒)。

我浏览了Android开源的WebUrlLoaderClient.cpp,发现超时和重试次数分别固定为10和3。

同样的请求在异步模式下工作正常。

请让我知道我是否在此代码中做错了什么,或者是否有任何其他方法可以执行响应时间超过 30 秒的同步 ajax 调用。

【问题讨论】:

  • 例如使用 Postman 请求是否可以正常工作?我认为是这样,因为非异步工作正常。我不知道是什么原因造成的,因为它只需更改标志即可。我不推荐任何同步的东西,任何东西(很少有例外)。只需使用回调并切换异步。
  • Ajax 永远不应该是同步的,为什么你希望它是同步的?顺便说一句,你说不能在 Android 上工作,那么其他设备作为桌面呢?并检查您的控制台是否有错误
  • 由于对 url 的请求是跨域请求,因此无法在桌面浏览器上运行(Firefox 和 Chrome 出现错误)。此 Ajax 请求作为应用程序的一部分在 Android 上的 webview 中运行。我没有在 ios 的 webview 上检查这个 Ajax 调用的行为,但是一旦我测试它就会更新。
  • 看起来服务器不接受同步请求,jsonp???但是为什么要同步呢?
  • 试试这个 super.setIntegerProperty("loadUrlTimeoutValue", 60000);

标签: javascript android jquery ajax webview


【解决方案1】:

恐怕您无法为同步 ajax 调用设置自定义超时...您必须异步并将下一个放入 .done 和 .fail ajax 调用中。

请看这里:Login working for Iphone but not android

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 2011-01-12
    • 2020-10-31
    • 2011-12-16
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多