在indexeddb上我想看看是否有密钥permanent
并做一些动作。但如果没有,我想做一些其他的行动。如果permanent
在那里,我可以采取行动,但是当它不存在时,我可以让错误发挥作用。 onerror
是否想要做这件事?如何检查其中是否没有值?
var hashtype='permanent';
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function() {
var ivrame=getPermanent.result.value;
};
getPermanent.onerror = function() {
console.log('onerror')
};
请参阅https://w3c.github.io/IndexedDB/#dom-idbobjectstore-get下的注释 - 如果没有匹配记录,get
方法会使用undefined
获得成功。
所以你有几个选择:
get(key)
并测试undefined
的结果。这是有效的,除非undefined
是您期望存储的值(它是有效值)count(key)
- 如果存在则结果为1,如果不存在则结果为0。如果您只是为了存在而进行测试,那么很容易,但是不能为您提供记录。openCursor(key)
并测试以查看请求的result
是否为光标(记录为request.result.value
)或undefined
(范围内无记录)对于你的代码:
var hashtype='permanent';
// #1: Use get
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function() {
if (getPermanent.result === undefined) {
// no record with that key
} else {
var value = getPermanent.result;
}
};
// #2: Use count
var getPermanent = store.count(hashtype);
getPermanent.onsuccess = function() {
if (getPermanent.result === 0) {
// no record with that key
} else {
...
}
};
// #3: Use cursor
var getPermanent = store.openCursor(hashtype);
getPermanent.onsuccess = function() {
var cursor = getPermanent.result;
if (!cursor) {
// no record with that key
} else {
var value = cursor.value;
}
};
分配给request.onsuccess的函数是一个始终被调用的回调函数,无论该值是否存在于商店中。当商店中没有相应的对象时,结果对象将是未定义的。当商店中有相应的对象时,将定义结果对象。因此,您只需要检查是否在onsuccess回调函数中定义了对象。
request.onerror是来自request.onsuccess的单独回调。当indexedDB中存在某种类型的失败时会调用onerror(例如,您尝试从不存在的存储中获取值,或者您尝试将重复的对象放入不允许重复的存储中)。如果由于调用store.get而未找到任何值,则不会调用request.onerror,因为在失败意义上不会将其视为“错误”。
那么,你想要做的是这样的事情:
var hashtype='permanent';
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function(event) {
//var ivrame=getPermanent.result.value;
var result = getPermanent.result;
if(result) {
console.log('Got a result!', result);
var ivrame = result;
} else {
console.log('Result was undefined! No matching object found');
}
};
getPermanent.onerror = function() {
console.log('Something went wrong trying to perform the get request');
};
不要尝试访问request.result.value。在获取请求的情况下没有这样的事情。当使用store.get时,request.result包含您想要的匹配对象,或者是未定义的。当使用store.openCursor时,request.result包含游标,如果至少有一个匹配对象并且您尚未迭代它,则定义游标。要在光标的当前位置获取匹配对象,可以使用cursor.value。这里,将始终定义cursor.value,因为否则游标将是未定义的,您显然会事先检查它。
不使用getPermanent.result
访问'get'请求提供的数据,最好使用event.target.result.
它也可以与undefined进行比较以检查所请求密钥的缺失:
db = this.result;
var tr = db.transaction("data");
var objstore = tr.objectStore("data");
var getres = objstore.get(0);
getres.onsuccess = function(event)
{
if(event.target.result.data === undefined)
console.log("key not found");
}