【发布时间】:2018-01-23 00:49:01
【问题描述】:
我有两个数据集,一个在 indexedDB 中,一个在 PouchDB 中(是的,我知道 PouchDB 是 indexedDB 的一种实现)。
indexedDB中的一个是房间列表,通过前一页存储在indexedDB中,显示在当前页。
PouchDB 中的一个是房间审计员记录的房间使用日志。我想遍历第一个列表,并检查每个项目是否出现在审核房间列表中。如果确实出现了,我想设置一个标志来表明这一点。
这是我的 Javascript。 (我已经在浏览器中运行了它,它确实在过程中的某个时刻返回 true,因为控制台日志输出显示了这一点,但没有针对列表项设置标志。)
我想知道它是否继续循环遍历审计记录并覆盖“真实”值?
这是查询indexedDB的函数,调用查询PouchDB的函数:
function getRoomsInRoute() {
var routeNumber = $.jStorage.get('currentRoute', '');
var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
openRequest = window.indexedDB.open("rooms", 1);
openRequest.onupgradeneeded = function() {
var db = openRequest.result;
var itemStore = db.createObjectStore("rooms", {keyPath: "room_id"});
var index = itemStore.createIndex("rooms", ["route_number"]);
};
openRequest.onerror = function(event) {
console.error(event);
};
openRequest.onsuccess = function (event) {
var db = openRequest.result;
db.onerror = function(event) {
// Generic error handler for all errors targeted at this database's requests
console.error(event.target);
console.log("Database error: " + event.target.error.name || event.target.error || event.target.errorCode);
};
var transaction = db.transaction(['rooms'], "readwrite");
var itemStore = transaction.objectStore("rooms");
var index = itemStore.index("rooms", ["route_number"]);
console.log('DB opened');
var intRouteNumber = parseInt(routeNumber);
//var range = IDBKeyRange.only(intRouteNumber);
itemStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if(cursor) {
var audited;
if(cursor.value.route_number == routeNumber) {
if (checkIfAudited(cursor.value.room_seq)) {
var audited = ' <span class="checked"><i class="fa fa-check"></i></span>';
} else {
var audited = "";
}
$('#mylist').append("<li id="+ cursor.value.room_id +" rel="+ cursor.value.room_seq +"> " + '<small>'+ cursor.value.room_seq + '. </small><a href="/static?action=edit&room_id='+ cursor.value.room_id +'&route_number='+ cursor.value.route_number +'&sequence='+ cursor.value.room_seq +'&roomname='+ cursor.value.room_name +'&capacity='+ cursor.value.room_capacity +'">' + cursor.value.room_name + '</a>'+audited+'</li> ');
}
cursor.continue();
} else {
console.log('Entries all displayed.');
if(!($.jStorage.get('reverseroute', ''))) {
reverseroute = 'asc';
} else {
reverseroute = $.jStorage.get('reverseroute', '');
}
appendHref(reverseroute);
}
};
// Close the db when the transaction is done
transaction.oncomplete = function() {
db.close();
};
};
}
这是查询 PouchDB 以查看它是否已被审计的函数:
function checkIfAudited(roomseq) {
var today = new Date();
if(is_BST(today) == true) {
var currentHour = today.getHours()+1;
} else {
var currentHour = today.getHours();
}
var currentDay = today.getDate();
var currentMonth = today.getMonth();
options = {},
that = this,
pdb = new PouchDB('pouchroomusage');
options.include_docs = true;
var pouchOpts = {
skipSetup: true
};
var opts = {live: true};
pdb.allDocs(options, function (error, response) {
response.rows.some(function(row){
var auditTime = new Date(row.doc.timestamp);
var auditHour = auditTime.getUTCHours();
var auditDay = auditTime.getDate();
var auditMonth = auditTime.getMonth();
if(row.doc.sequence == roomseq && currentHour == auditHour && currentDay == auditDay && currentMonth == auditMonth) {
var isAudited = true;
console.log('RoomSeq: ' + roomseq + '; auditHour: ' + auditHour + '; currentHour: ' + currentHour + '; auditDay: ' + auditDay);
console.log('currentDay: ' + currentDay + '; auditMonth: ' + auditMonth + '; currentMonth: ' + currentMonth + '; isAudited: ' + isAudited);
} else {
var isAudited = false;
console.log('No matches');
}
return isAudited;
});
});
}
我已经阅读了许多关于比较两个数组的其他问题和答案。
我不知道如何使用for 循环和pdb.allDocs :(
这是console.log的输出:
49 没有匹配项
房间序列:1;审计时间:14;当前时间:14;审计日:16 当前日:16;审计月:0;当前月份:0;已审核:真实
2300 没有匹配项
那么,如何让第二个函数在 PouchDB 中遇到匹配记录时停止并返回 true?
【问题讨论】:
-
还是因为我返回了变量
isAudited而调用函数不知道如何处理它?
标签: javascript arrays indexeddb pouchdb