1

我的 phonegap 应用程序包含一个用于填充 Web 数据库 (sqlite) 的 javascript 工作流。工作流由一系列同步执行的 ajax 'GET' 请求组成(各个 ajax 请求是异步的,但一个请求在前一个请求完成之前不会启动)。

我观察到一个请求会间歇性地无限期挂起(既不成功也不失败)。当我对 ajax 请求设置超时时,请求将超时。当它发生时,XmlHttpRequest具有以下状态:

status: 0
readyState: 0
statusText: 'timeout'

让我大吃一惊的是,如果我设置代理并通过提琴手观察网络流量,我会看到发出的请求,以及服务器在 60 秒超时内返回的预期响应。

更新:如果我通过safari上的开发人员工具监控我的开发 iPad 的净流量,我观察到该请求似乎没有得到响应。所以看起来响应要么没有做出,要么被设备忽略。

我无法在运行 android 或在我的工作站上以 chrome 运行的 nexus 7 上重现此错误,这使我相信该问题特定于 iOS(版本 6.1.3)

以下是适用代码的简化示例:

function syncWebDatabase() {
    var sqlScript;

    return retrieveEntity('users', sqlScript )
        .then(function () {
            return retrieveEntity('accounts', sqlScript );
        })
        .then(function () {
            return retrieveEntity('orders', sqlScript );
        })
        .then(function () {
            return retrieveEntity('shipments', sqlScript );
        })
        .then(function () {
            return executeScript(sqlScript);
        });
}

function retrieveEntity(entityName, sqlScript) {
    return $.ajax({
             url: 'http://myrestfulservice/' + entityName,
             type: 'GET',
             dataType: 'json',
             timeout: 60000,
             error: function(jqXHR, textStatus, errorThrown) {
               //handle error condition
             }
           }).then(function (entites) {
               return generateInsertStatements(entities, sqlScript);
           })

}

function generateInsertStatements(entities, sqlScript) {
    //appends insert statement for each entity to sqlscript
}

function executeScript(sqlScript) {
    //executes sql script against web database
}

我将不胜感激对我所观察到的内容的解释,以及对我的问题的解决方案或关于如何进一步调查该问题的评论。

4

0 回答 0