我正在编写一个函数,它在我的IndexedDB中搜索一个值,如果找到一个,那么它应该返回1,否则它应该返回0.问题是它总是返回0,尽管该值存在于数据库中(变量arr递增,但结果返回0)。代码如下:
searchAllValues: function(store, type)
{
var arr = 0;
AAA.initDb(function()
{
var obj = {};
AAA.aaaDb.transaction(store).objectStore(store).openCursor().onsuccess = function(store)
{
var storeresult = store.target.result;
if(storeresult.value.value == type ){
arr++;
}else{console.log('value NOT found');}
storeresult ? (obj[storeresult.key] = storeresult.value.value, storeresult["continue"]()) : callback(obj)
}
});if(arr!=0){return 1}else{return 0}
}
EDIT_1: 好的,我按如下方式重构了代码:
addInfo: function(store, type, info)
{
var arr = [];
P4S.p4sPushDb.transaction(store).objectStore(store).openCursor().onsuccess = function(store)
{
var storeresult = store.target.result;
console.log('value of storeresult==>'+storeresult.value.value);
if(storeresult.value.value == info)
{
arr.push(storeresult.value.values);return;//If it finds something it should stop here, no more search or anything to be done
}else
{
console.log('continuing..');
storeresult['continue']();
}
console.log('arr length==> '+arr.length);//If it finds nothing after the looping the whole DB, I want it to print this statement, only once (to send it to my DB actually but sending code is omitted for simplicity).
}
}
相反,我为对象存储中的每个键执行了2次console.log('arr length ==>')语句(实际上有2个)。因此,它在找不到任何内容时以及在数据库中找到值时执行代码。任何想法如何解决它?
欢迎任何想法,谢谢
答案 0 :(得分:1)
因为在执行第if(arr!=0){return 1}else{return 0}
行时,db事务未完成且arr的值为0.虽然从未使用过indexedDb,但webSql确实需要额外的几毫秒来从DB读取。
尝试将返回逻辑放在 onsuccess 函数中,然后递增arr。您只需在返回逻辑
之前打印 arr 的值即可对其进行测试答案 1 :(得分:0)
您需要了解如何编写异步javascript。还有其他几个indexedDB问题,其中有解释为什么会发生这种情况。
例如:Uncaught TypeError: Cannot read property 'transaction' of null with an indexeddb
答案 2 :(得分:0)
function addInfo(store, type, info, next)
{
var arr = [];
P4S.p4sPushDb.transaction(store).objectStore(store).openCursor().onsuccess = function(store)
{
var storeresult = store.target.result;
console.log('value of storeresult==>'+storeresult.value.value);
if(storeresult.value.value == info)
{
arr.push(storeresult.value.values);
next(arr);//If it finds something it should stop here, no more search or anything to be done
}else
{
console.log('continuing..');
storeresult.continue();
}
console.log('arr length==> '+arr.length);//If it finds nothing after the looping the whole DB, I want it to print this statement, only once (to send it to my DB actually but sending code is omitted for simplicity).
}
}
添加了一个名为' next'的额外参数到你的addInfo函数。 '下一个'如果condition(storeresult.value.value == info)为true,则param是最后一个调用的函数。 您创建的下一个功能将使用' arr'变量并用它做任何事情
你的回复声明'与异步函数不同的是,它会强烈建议你搜索异步函数,以获得它与常规函数的不同之处
您可以通过以下方式调用新编辑的功能:
addInfo(store,type,info,function(arr){
//do something with arr
})
请注意,您的潜在状态会破坏您的代码 如果光标到达其迭代的末尾并且从不满足该条件(storeresult.value.value == info)该怎么办? storeresult将为null,并且检查条件( null .value.value == info)将引发异常
校正:
function addInfo(store, type, info, next)
{
var arr = [];
P4S.p4sPushDb.transaction(store).objectStore(store).openCursor().onsuccess = function(store){
var storeresult = store.target.result;
if(storeresult){
if(storeresult.value.value == info){
arr.push(storeresult.value.values);
next(arr);
}else storeresult.continue();
}else next();
}
}
当你调用它时,你会处理arr == null
的场景addInfo(store,type,info,function(arr){
if(arr){
//do something with arr
}else{
//do somethingelse when arr == null
}
})