Javascript函数始终返回0

时间:2016-04-01 11:56:03

标签: javascript indexeddb

我正在编写一个函数,它在我的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个)。因此,它在找不到任何内容时以及在数据库中找到值时执行代码。任何想法如何解决它?

欢迎任何想法,谢谢

3 个答案:

答案 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
  }
})