我有两个数据集,一个在indexedDB中,一个在PouchDB中(是的,我知道PouchDB是indexedDB的一种实现)。
indexedDB中的是房间列表,通过上一页存储在indexedDB中,并显示在当前页面上。
PouchDB 中的是房间审计员记录的房间使用日志。我想遍历第一个列表,并检查每个项目是否出现在已审核房间的列表中。如果它确实出现,我想设置一个标志来表明这一点。
这是我的 JavaScript。 (我已经在浏览器中运行了它,它确实在该过程中的某个时刻返回 true,因为控制台日志输出显示了这一点,但该标志并未针对列表项设置。)
我想知道它是否继续循环审核记录并覆盖“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 No matches
RoomSeq: 1; auditHour: 14; currentHour: 14; auditDay: 16 currentDay: 16; auditMonth: 0; currentMonth: 0; isAudited: true
2300 No matches
那么当第二个函数命中 PouchDB 中的匹配记录时,如何让第二个函数停止并返回 true?
最佳答案
首先,我不太喜欢利用 Array.prototype.some
的短路行为。使用您可用的 native 功能。 indexedDB 提供了一种内置方法来停止前进游标,或仅从存储中加载有限数量的对象。
其次,当您只对其中一些对象感兴趣时,您可能希望避免从存储中加载所有对象。使用光标在商店中行走。由于您似乎希望在满足某些条件时停止迭代,因此此时不要调用cursor.continue。
第三,即使决定首先从存储中加载所有对象,使用 for 循环也比利用 some
好得多。我所说的利用是指以非预期的方式使用该函数。我敢打赌,如果您恢复使用带有break语句的for循环,代码将会更清晰,因此会更容易理解为什么循环在您期望它这样做时不会中断。
第四,我会花时间将 indexedDB 查询的结果附加到中间数据结构(如数组),而不是立即与 DOM 交互。它将更加分离事物,并且您会发现代码更易于调试。
第五,将异步调用与 indexedDB 混合在一起时应该非常小心。众所周知,当您交错调用其他 Promise 时,indexedDB 会出现问题。
关于javascript - 当两个数组之间找到匹配项时停止迭代并返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283579/