我如何在WinJS队列异步函数调用

How do I queue asynchronous function calls in WinJS?

本文关键字:队列 异步 函数调用 WinJS      更新时间:2023-09-26

我正在使用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)
  });
});
所以,基本上,我需要让异步调用等待轮到它们。如何做到这一点最好的约束,对数据库的访问必须看起来像上面的函数?

这是一个未经测试的重试逻辑实现。它最多重试numOfRetries次,每次重试延迟delay ms。

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