我试图找出在存储或更改对象时使用钩子向对象添加一些字段的最佳方法。
基本思想是有些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});
});
};
});