javascript - 在 Dexie 迭代中使用 setTimeout
问题描述
我需要使用 Dexie 迭代 IndexedDB 表并使用某些功能处理每个项目。
我的代码是这样的:
var db = new Dexie(dbName);
db.version(dbVersion).stores({
smthtbl: '++id, data, creationTime'});
db.smthtbl.each(function (item) {
return proccessItem(item);
}).then(function() {
console.log("done");
return "done"
});
function proccessItem(item) {
console.log(item.id + " : " + item.data);
};
而且我需要在迭代之间设置一个超时,以便通过超时显示每个下一个项目。
解决方案
像这样的东西可能对你有用。
下面的iterateWithDelay
函数可用于任何其他需要缓慢迭代项目数组的情况。我也让它传递索引和数组,就像这样.map()
做一样。(如果回调返回某个值,例如 等false
,您还可以添加一个功能来停止迭代)
干编码、YMMV 等 :)
const iterateWithDelay = (items, delay, callback) =>
new Promise(resolve => {
let index = 0;
const tick = () => {
const item = items[index];
if (!item) {
resolve();
return;
}
callback(item, index, items);
index++;
setTimeout(tick, delay);
};
tick();
});
var db = new Dexie(dbName);
db.version(dbVersion).stores({ smthtbl: "++id, data, creationTime" });
db.smthtbl
.toArray(items => iterateWithDelay(items, 100, proccessItem))
.then(() => {
console.log("done");
return "done";
});
function proccessItem(item) {
console.log(item.id + " : " + item.data);
}
推荐阅读
- javascript - 尝试更新板,但返回 true
- javascript - 有没有办法让 JQuery 动画功能阻塞
- python - 无法在开发模式下启动 Plaid 快速入门应用
- android - 如何关闭我的 esp32 无源蜂鸣器?
- java - Java.lang.ArithmeticException:/LinearProbingHashSet 中的零
- ios - 点击 UITextField 时,出现 DatePicker
- api - 如何关闭谷歌地图并只显示路线?
- javascript - 提到的User.joinedAt 返回“未定义”
- javascript - 访问 XMLHttpRequest 已被 CORS 阻止,尝试一切仍然失败
- python - Chromedriver 和 selenium 创建访客帐户而不是使用实际帐户