如何在WinJS中对异步函数调用进行排队?

时间:2014-03-21 22:44:50

标签: javascript asynchronous sqlite windows-runtime winjs

我正在使用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)
  });
});

所以,基本上,我需要让异步调用等待轮到他们。考虑到对数据库的访问必须看起来像上面那个函数的约束,我该如何做到最好?

1 个答案:

答案 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();
        });
    });
}