在indexeddb上,我想看看是否有一个键permanent
,并执行一些操作。但如果没有,我想执行一些其他操作。如果permanent
存在,我可以执行这些操作,但如果没有,我可以让onerror工作。onerror
应该做这件事吗?我如何检查它是否没有值?
var hashtype = 'permanent';
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function() {
var ivrame = getPermanent.result.value;
};
getPermanent.onerror = function() {
console.log('onerror')
};
3条答案
按热度按时间lfapxunr1#
请参阅www.example.com下的注解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
(范围内没有记录)对于您的代码:
hm2xizp92#
分配给request.onsuccess的函数是一个回调函数,无论存储区中是否存在该值,该函数都将被调用。当存储区中没有对应的对象时,结果对象将是未定义的。当存储区中存在对应的对象时,结果对象将被定义。因此,您只需检查对象是否是从onsuccess回调函数中定义的。
onerror是一个独立于request.onsuccess.onerror的回调函数,当indexedDB中出现某种类型的故障时,将调用onerror(例如,类似于你试图从一个不存在的存储中获取一个值,或者你试图将一个重复的对象放入一个不允许重复的存储中)。当调用store.get而没有找到值时,request.onerror * 不会 * 被调用,因为这不被认为是故障意义上的“错误”。
所以,你要做的事情是这样的:
不要尝试访问request.result.value。在get请求的情况下没有这样的操作。使用store.get时,request.result包含所需的匹配对象,或者未定义。使用store.openCursor时,request.result包含游标,如果至少有一个匹配对象并且您尚未遍历过它,则定义游标。要在游标的当前位置获取匹配对象,你可以使用cursor.value。这里,cursor.value总是被定义的,因为cursor是未定义的,你应该事先检查一下。
vptzau2j3#
与其使用
getPermanent.result
来访问'get'请求提供的数据,不如使用event.target.result.
。它还可以与undefined进行比较,以检查是否存在所请求的密钥: