我有以下代码:
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;
}
有没有办法等待执行结束?还是这不是检查值是否存在的好方法?
最佳答案
由于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编写了一个包装程序,该包装程序使用了基于Promise的API,称为db.js。
关于javascript - 等待openCursor在IndexedDB中完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22083646/