在 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);
}