javascript - 引用被设置为异步的属性

标签 javascript indexeddb

我正在尝试重构一些我编写的使用 IndexedDb 的代码。理想情况下,我想做的是创建一个小型业务库,抽象出使用 IndexedDb 的一些丑陋之处。例如,我将创建一个 toDoList 对象,该对象将具有一些获取、添加、更新、删除的方法,并且在这些方法中我将调用 IndexedDb。

这是我所拥有的示例:

var MyApp = MyApp || {};

(function() {

  var req = indexedDB.open("todostore", 1);

  req.onerror = function(e) { console.log(e); };

  req.onupgradeneeded = function (e) {
    var newDB = e.target.result;
    newDB.createObjectStore("todostore", { keyPath : "id", autoIncrement : true });
  };

  req.onsuccess = function () {
    MyApp.db = req.result;
  };

})();

MyApp.todolist = (function() {
  return {
    get : function(key, success) {
      var tran = MyApp.db.transaction("todostore");
      var req = tran.objectStore("todostore").get(key);

      req.onsuccess = function (e) {           
        success(e.target.result);
      };
    }
  };
})();

//consumer of library would ideally just do something like this:

var worked = function(e) {
   //do something...
}
MyApp.todolist.get(1, worked);

问题是 MyApp.db 在 get 方法中未定义,因为尚未触发 onsuccess 回调。我对 javascript 还很陌生,所以想知道我可以使用哪些选项/模式。感谢您的帮助!

最佳答案

可能有 1000 种不同的方法来处理这个问题。但我建议简单地在“get”方法中包含一个失败选项,并在数据库未准备好时触发该选项:

MyApp.todolist = (function() {
  return {
    get : function(key, success, failure) {
      if(!MyApp.db) { 
        if(typeof failure === "function") {
          failure("Database is not ready yet");
        } 
        return;
      }
      var tran = MyApp.db.transaction("todostore");
      var req = tran.objectStore("todostore").get(key);

      req.onsuccess = function (e) {           
        success(e.target.result);
      };
    }
  };
})();

//consumer of library would ideally just do something like this:

var worked = function(e) {
   //do something...
};

var didntWork = function(e) {
   //report the error, e.
};

MyApp.todolist.get(1, worked, didntWork);

您还应该考虑为您的客户端提供回调方法,以便确定数据库何时准备就绪(或未准备就绪)。如果没有别的,至少提供一些方法让他们可以通过某种方法轻松检查数据库是否准备好。根据您希望如何向用户展示该工具,您可以使用多种选项。

关于javascript - 引用被设置为异步的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292666/

相关文章:

javascript - 在 JavaScript 中 chop/舍入整数?

javascript - Firebase 关键引用

html - 如何同步循环遍历 indexedDB 表?

JavaScript:如何从 IndexedDB 检索最新记录?

javascript - 如何将 JSON 对象转换为 JavaScript 数组?

php - 将新行追加到 MySQL 查询调用的 HTML 表,并更新 MySQL 中的当前列

javascript - 通过 CSS 实现多 Pane 滚动

javascript - 使用 Image 添加记录时 IndexedDB 崩溃

javascript - IDBFactory.onsuccess 与 IDBFactory.oncomplete

javascript - 编辑 IndexedDB 示例