2016-11-21 44 views
1

以下是我的indexeddb(IDB)objectStore名称及其调用方法。使用索引DB中的游标

我想要的是从objectStore中获取值,并根据条件匹配值将这些值计算添加到变量中。

var item_id = []; 
var db; 
function displayNotes(filter) { 
    var line = 0; 
    var transaction = db.transaction(["frp_item_master"], "readonly"); 
    var itemsname =[]; 
    var itemsqty =[]; 
    var itemsprice =[]; 
    var itemsdisc =[]; 
    var itemstax =[]; 

    var handleResult = function(event) { 
     var cursor = event.target.result; 
     var price_with_tax; 
     var i = 0; 
     i++; 
     if (cursor) { 
      ++line; 
       if (cursor.value.item_id == 20008) 
       { 
       item_id.push(event.target.result.value.item_id); 
       //and other array push here 

       //call function      
       price_with_tax = (get_tax(itemstax)/100)*itemsprice; 

       } 
     cursor.continue(); 
     } 
     else { 
     //error 
     } 
    }; 

然后在创建我的函数后,在上面的方法中调用。

function get_tax(p_tax_master_id){ 
    var get_me; 
    var total_tax_rate = 0; 

    var transaction = db.transaction(["frp_tax_master"], "readonly"); 
    var objectStore = transaction.objectStore('frp_tax_master'); 

    objectStore.openCursor().onsuccess = function(event){ 

    var cur = event.target.result; 
    get_me = event.target.result.value.tax_master_id; 
    console.log('get_me'+get_me); 
    if (cur) { 
     if (get_me == 2008) 
      { 
       total_tax_rate += event.target.result.value.rate; 
       console.log("total tax"+total_tax_rate); 
      } 
     cur.continue(); 
      } 
     else { 
      console.log('else'+get_me); 
      } 
    }; 
    return total_tax_rate; 
}; 

我收到错误,如图像所示。即使对象存储中没有值,游标仍在运行,并且它显示值不能设置为空。

我们是否可以循环遍历所有记录,直到取出最后一个值,然后退出游标将该值赋给变量。

基本上我给一个变量添加了一些数字。 screenshot-1 screenshot-2

+0

在未来,请尝试包括错误的文本消息而不是截图。另外,请只重复错误似乎发生在你身上的代码行,而不是截取它的截图。谢谢! – Josh

回答

1

在这一行你得到光标:

var cur = event.target.result; 

在这里你正确地检查光标不为空使用它之前:

if (cur) { 

,但此行假设event.target.result不为空:

get_me = event.target.result.value.tax_master_id; 

因此,当光标达到其范围的末尾时,event.target.result为空,它会在控制台告诉您的确切行上为您提供“无法读取属性”值“null”错误。

考虑将该行移入if (cur)块。

+0

谢谢你做了诡计 –

0

除了约书亚表示,onsuccess方法是异步的,所以你get_tax函数总是返回0。

考虑是这样的:

function get_tax(p_tax_master_id, cb) { 
    var get_me; 
    var total_tax_rate = 0; 

    var transaction = db.transaction(["frp_tax_master"], "readonly"); 
    var objectStore = transaction.objectStore('frp_tax_master'); 

    objectStore.openCursor().onsuccess = function(event){ 
     var cur = event.target.result; 
     console.log('get_me'+get_me); 

     if (cur) { 
      get_me = event.target.result.value.tax_master_id; 

      if (get_me == 2008) { 
       total_tax_rate += event.target.result.value.rate; 
       console.log("total tax"+total_tax_rate); 
      } 

      cur.continue(); 
     } else { 
      console.log('else'+get_me); 

      cb(null, total_tax_rate); 
     } 
    }; 
}; 

您也可能更喜欢使用一个库等作为ZangoDB所以你可以执行一个查询,如:

var db = new zango.Db('db_name', ['frp_tax_master']); 
var frp_tax_master = db.collection('frp_tax_master'); 

function get_tax(p_tax_master_id, cb) { 
    frp_tax_master.find({ 
     tax_master_id: 2008 
    }).group({ 
     total_tax_rate: { $sum: '$rate' } 
    }).toArray((error, docs) => { 
     if (error || !docs[0]) { cb(error); } 
     else { cb(null, docs[0].total_tax_rate); } 
    }); 
} 
+0

是的感谢你加入它 –