在Dexie迭代中使用setTimeout

时间:2019-03-05 08:33:40

标签: javascript promise dexie

我需要使用Dexie迭代IndexedDB表,并使用某些功能处理每个项目。

我的代码是这样的:

let accountCode = {a: 1, b: 2};
let array = [1, 2, 3, 4];

let output = {};
for (let key of array) {
    output[key] = accountCode;
}

// Almost forgot this
this.setState(output);

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

1 个答案:

答案 0 :(得分:0)

类似的事情可能对您有用。

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