используя setTimeout внутри итерации Dexie - PullRequest
0 голосов
/ 05 марта 2019

Мне нужно перебрать таблицу IndexedDB с Dexie и обработать каждый элемент некоторой функцией.

Мой код выглядит примерно так:

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

И мне нужно установить время ожидания между итерациями, чтобы каждый следующий элемент отображался в течение времени ожидания.

1 Ответ

0 голосов
/ 05 марта 2019

Что-то вроде этого может работать для вас.

Функция 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);
}
...