Javascript 正在引用设置为异步的属性

Javascript 正在引用设置为异步的属性,javascript,indexeddb,Javascript,Indexeddb,我正在尝试重构我编写的一些使用IndexedDb的代码。理想情况下,我想做的是创建一个小型业务库,抽象使用IndexedDb的一些丑陋之处。例如,我将创建一个toDoList对象,该对象将有一些方法来获取、添加、更新、删除,在这些方法中,我将调用IndexedDb 以下是我的一个例子: var MyApp = MyApp || {}; (function() { var req = indexedDB.open("todostore", 1); req.onerror = func

我正在尝试重构我编写的一些使用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);

您还应该考虑为客户端提供回调方法,以确定数据库何时就绪(或没有)。如果没有其他方法,至少可以为他们提供一些方法,以便通过方法轻松检查数据库是否准备就绪。根据您希望如何将工具呈现给用户,有很多选项可供选择。

“您还应该考虑为客户提供回调方法,以确定数据库何时准备好。”我认为这是更好的解决方案。如果您知道您将遇到等待数据库准备就绪的情况,那么不妨处理它。异步代码凌乱难看,但从长远来看,试图忽略IndexedDB的异步本质更糟糕。我的思维障碍是如何“等待”db被设置,然后继续w/flow,你的回答让我明白了这一点,谢谢。最后,我添加了一个init方法,并承诺等待数据库初始化,然后继续应用程序流的其余部分。