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