Javascript 正在引用设置为异步的属性
我正在尝试重构我编写的一些使用IndexedDb的代码。理想情况下,我想做的是创建一个小型业务库,抽象使用IndexedDb的一些丑陋之处。例如,我将创建一个toDoList对象,该对象将有一些方法来获取、添加、更新、删除,在这些方法中,我将调用IndexedDb 以下是我的一个例子:Javascript 正在引用设置为异步的属性,javascript,indexeddb,Javascript,Indexeddb,我正在尝试重构我编写的一些使用IndexedDb的代码。理想情况下,我想做的是创建一个小型业务库,抽象使用IndexedDb的一些丑陋之处。例如,我将创建一个toDoList对象,该对象将有一些方法来获取、添加、更新、删除,在这些方法中,我将调用IndexedDb 以下是我的一个例子: var MyApp = MyApp || {}; (function() { var req = indexedDB.open("todostore", 1); req.onerror = func
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方法,并承诺等待数据库初始化,然后继续应用程序流的其余部分。