残念ながら、フックは同期的であり、その中で非同期呼び出しを行う方法はありません。これは変わるつもりですが、私はいつ約束することはできません。次の6ヶ月以内にフック・フレームワークを書き直し、非同期(既存のフックの下位互換性を維持)できるバルク・フック(よりパフォーマンスの高いもの)を許可します。
これまでは、(ユーザーが明示的なトランザクションを行っているかどうかに関わらず)フックが常にトランザクション内で呼び出され、現在のトランザクションに対して追加の操作を行うことができます。あなたの追加の変更があなたのフックを再び引き起こすかもしれないので、あなたが無限ループに終わらないことを確認する必要があります。
の例では、このようになります:
db.entries.hook('creating', (primKey, entry, trans) => {
entryDerivedData(entry).then(derived => {
db.entries.update(primKey, { derived }).catch (e => {
// Failed to update. Abort transaction by rethrow error:
throw new Error ("Could not make sure derived property was set properly");
});
});
});
db.entries.hook('updating', (mods, primKey, entry, trans) => {
if ('derived' in mods) return; // We're the one triggering this change. Ignore.
// First, apply the mods onto entry:
var entryClone = Dexie.deepClone(entry);
Object.keys(mods).forEach(keyPath => {
if (mods[keyPath] === undefined)
Dexie.delByKeyPath(entryClone, keyPath);
else
Dexie.setByKeyPath(entryClone, keyPath, mods[keyPath]);
});
entryDerivedData(entryClone).then(derived => {
db.entries.update(primKey, { derived }).catch (e => {
// Failed to update. Abort transaction by rethrow error:
throw new Error ("Could not make sure derived property was set properly");
});
});
});