Похоже, что когда в Chrome выполняется много последовательных SQL-запросов, некоторые теряются, то есть не завершаются, но не вызывают никаких ошибок / предупреждений.
Вот самый простой тест, который я смог придумать:
var shortName = "db", version = "1.0", displayName = "db", maxSize = 20 * 1024 * 1024;
var db = openDatabase(shortName, version, displayName, maxSize);
db.transaction(function(tx) {
tx.executeSql("CREATE TABLE IF NOT EXISTS cache (key TEXT PRIMARY KEY ASC NOT NULL, value TEXT NULL);");
});
for (var i=0; i<5; i++) {
db.transaction(function(tx) {
tx.executeSql("SELECT * FROM cache WHERE key = ?", ["test"],
function() {
console.log("ok");
},
function() {
console.warn("error: ", err);
});
});
}
Теперь, если я добавлю вышеуказанный код на веб-страницу, я ожидаю увидеть FIVE "ok" в консоли, например, так: http://i.stack.imgur.com/FgcNz.png (это правильно).
Но если я быстро перезагружаю страницу, я иногда получаю худший номер, без каких-либо ошибок или предупреждений, например: http://i.stack.imgur.com/bc5Kl.png (это неверно: только ДВА "ок" вместо пять).
Вот мои вопросы:
- есть ли ошибка в коде выше?
- если нет, это ошибка Chrome / Sqlite или "нормальное" / ожидаемое поведение?
- и самое главное, как я могу защититься от этого? Мне действительно нужно знать, завершается ли каждый запрос, потому что, если они могут просто завершиться в подвешенном состоянии, то часть кода, которая зависит от него, никогда не запускается ...
Я использую 9.0.597.19 бета.