在 Dexie 迭代中使用 setTimeout
using setTimeout inside a Dexie iteration
我需要用 Dexie 迭代 IndexedDB table 并使用某些函数处理每个项目。
我的代码是这样的:
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()
一样。 (如果回调 returns 某个值如 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);
}
我需要用 Dexie 迭代 IndexedDB table 并使用某些函数处理每个项目。
我的代码是这样的:
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()
一样。 (如果回调 returns 某个值如 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);
}