首页 > 解决方案 > 在 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);
};

而且我需要在迭代之间设置一个超时,以便通过超时显示每个下一个项目。

标签: javascriptpromisedexie

解决方案


像这样的东西可能对你有用。

下面的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);
}

推荐阅读