我有这段代码:
html5DB.indexedDB.addSomething = function(foo) {
var db = html5DB.indexedDB.db;
var trans = db.transaction(["something"], "readwrite");
var store = trans.objectStore("something");
var isExisting = IsAlreadyExist(foo);
// How to wait for that instruction to finish?
if (!isExisting){
var request = store.put({
"text": foo,
"timeStamp" : new Date().getTime()
});
}
};
我试图了解如何等待函数IsAlreadyExist
完成。此函数打开游标以在对象库中迭代,以确定是否存在特定值。
实际上,没有错误,但我无法访问if (!isExisting)
内的代码,因为变量的值永远不会改变。
这是第二个功能的代码:
function IsAlreadyExist(foo){
var db = html5DB.indexedDB.db;
var objectStore = db.transaction("something").objectStore("something");
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
if (cursor.value.text == foo)
return true;
cursor.continue();
}
};
return false;
}
有没有办法等待执行结束?或者,这可能不是检查值是否存在的好方法?
答案 0 :(得分:3)
由于IndexedDB是一个异步API,你必须等到使用回调完成操作。
首先我们需要重构IsAlreadyExist
方法:
function IsAlreadyExist(foo, oncomplete) {
var db = html5DB.indexedDB.db;
var transaction = db.transaction("something");
var objectStore = transaction.objectStore("something");
var exists = false;
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
if (cursor.value.text == foo) {
exists = true;
return;
}
cursor.continue();
}
};
transaction.oncomplete = function () {
oncompleted(exists);
};
}
现在我们将重构您的其他方法:
html5DB.indexedDB.addSomething = function(foo) {
IsAlreadyExist(foo, function (isExisting) {
if (!isExisting){
var db = html5DB.indexedDB.db;
var trans = db.transaction(["something"], "readwrite");
var store = trans.objectStore("something");
var request = store.put({
"text": foo,
"timeStamp" : new Date().getTime()
});
}
});
};
所以在这里你会看到我们正在传递函数,当光标搜索作为回调完成时,它会接收状态参数。
这可能会开始变得有点难看,这就是为什么Promise在JavaScript中很受欢迎的原因。我为IndexedDB编写了一个包装器,它使用了一个名为db.js的基于Promise的API。