我正在使用SQLite3-WinRT作为我的WinJS项目,但最近遇到了一些查询可能会锁定数据库的问题。
快速而肮脏的方法是等待一段任意时间,然后再试一次(因为这是一个单用户应用程序)。
此类查询的示例如下所示:
var sql_query = "SELECT * FROM Table;";
SQLite3JS.openAsync(path_to_db)
.then(function (db) {
return db.runAsync(sql_query)
.then(function () {
db.close();
}, function (error) {
db.close();
console.log(error)
});
});
所以,基本上,我需要让异步调用等待轮到他们。考虑到对数据库的访问必须看起来像上面那个函数的约束,我该如何做到最好?
答案 0 :(得分:1)
这是一个未经测试的重试逻辑实现。它重试最多numOfRetries
次,每次重试都会延迟delay
毫秒。
var doWorkAsync = function (numOfRetries, delay) {
var sql_query = "SELECT * FROM Table;";
SQLite3JS.openAsync(path_to_db)
.then(function (db) {
return WinJS.Promise(function (resolve, reject) {
var nextStep = function () {
db.runAsync(sql_query)
.then(function (result) {
db.close();
resolve(result);
}, function (error) {
if (--numOfRetries >= 0)
WinJS.Promise.timeout(delay).then(nextStep);
else
{
db.close();
console.log(error);
reject(new WinJS.ErrorFromName(error.name, error.message));
}
});
};
nextStep();
});
});
}