【问题标题】:using setTimeout inside a Dexie iteration在 Dexie 迭代中使用 setTimeout
【发布时间】:2019-07-26 15:56:04
【问题描述】:

我需要用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);
};

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

【问题讨论】:

  • each next item is displayed through the timeout.是什么意思

标签: javascript promise dexie


【解决方案1】:

这样的事情可能对你有用。

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

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 2015-08-25
    • 2013-06-29
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多