Я пытаюсь найти лучший подход для использования крючков для добавления некоторых полей в объект, когда он будет сохранен или изменен.Изменения Async в обновляющем крючке Dexie
Основная идея: есть объекты entry
, которые должны содержать кучу свойств, которые основаны на некоторых сложных запросах и вычислениях других записей. Эти рассчитанные свойства хранятся под свойством, называемым derived
. Было бы слишком дорого вычислять entry.derived
каждый раз, когда это необходимо, или когда оно считывается из БД. Вместо этого я решил заблаговременно заполнить свойство derived
, и крючки кажутся лучшим местом для этого.
Это не проблема для крюка creating
. Однако мне также необходимо сгенерировать derived
, если изменится какое-либо другое свойство в entry
. Крючок updating
требует отправки дополнительных изменений, возвращая их, что является проблематичным, потому что единственный способ, с помощью которого я могу сгенерировать изменение, - через асинхронный вызов.
Ниже приведен минимальный код, который пытается продемонстрировать проблему. Я еще не пробовал вариант B
, но я подозреваю, что это тоже не сработает.
const entryDerivedData = function(entry) {
// query a bunch of data from entries table then do some calculations
return db.entries.where('exerciseID').equals(entry.exerciseID).toArray()
.then(e => {
// do some calculation and return
return calculateDerivedData(e);
});
};
// A: Can't do this because `hook` isn't expecting a generator func
db.entries.hook('updating', function*(mods, primKey, entry, transaction) {
const derived = yield entryDerivedData(entry);
return derived;
});
// B: Another possibility, but probably won't work either
db.entries.hook('updating', function(mods, primKey, entry, transaction) {
transaction.scopeFunc = function() {
return entryDerivedData(entry)
.then(derived => {
// Won't this result in another invocation of the updating hook?
return db.entries.update(entry.id, {derived});
});
};
});