在索引数据库中使用游标
Working with cursors in Indexed DB
下面是我的 indexeddb(IDB) objectStore 名称和它的调用方法。
我想要的是从 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
在这一行你得到光标:
var cur = event.target.result;
在这里你正确地检查了游标在使用前不为空:
if (cur) {
但是这一行假定 event.target.result
不为空:
get_me = event.target.result.value.tax_master_id;
因此,当光标到达其范围的末尾时,event.target.result
为 null,这会在控制台告诉您的确切行上为您提供 "can't read property 'value' of null" 错误。
考虑将该行移动到 if (cur)
块中。
除了 Joshua 所说的,onsuccess
方法是异步的,所以你的 get_tax
函数总是 return 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); }
});
}
下面是我的 indexeddb(IDB) objectStore 名称和它的调用方法。
我想要的是从 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
在这一行你得到光标:
var cur = event.target.result;
在这里你正确地检查了游标在使用前不为空:
if (cur) {
但是这一行假定 event.target.result
不为空:
get_me = event.target.result.value.tax_master_id;
因此,当光标到达其范围的末尾时,event.target.result
为 null,这会在控制台告诉您的确切行上为您提供 "can't read property 'value' of null" 错误。
考虑将该行移动到 if (cur)
块中。
除了 Joshua 所说的,onsuccess
方法是异步的,所以你的 get_tax
函数总是 return 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); }
});
}