オブジェクトが保存または変更されたときにフックを使用してオブジェクトにいくつかのフィールドを追加するための最良の方法を見つけようとしています。
基本的な考え方はentry
、いくつかの複雑なクエリと他のエントリの計算に基づく一連のプロパティを含む必要があるオブジェクトがあるということです。これらの計算されたプロパティはすべて、 というプロパティの下に保存されますderived
。entry.derived
必要なたびに、または DB から読み取られるたびに計算すると、非常にコストがかかります。代わりに、事前にプロパティを設定することを選択しましたが、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});
});
};
});