私はすぐにコンテキストを使ってこのようなことを達成できると考えています。競合状態の問題を解決するために、オブジェクトのようなキャッシュをイベントエミッタと混在させることができると思います。例えば
、我々はあなたがこのような何かを行うことができ、あなたのリゾルバから次にいくつかのクラスに
class CacheEmitter extends EventEmitter {
constructor() {
super();
this.cache = {};
}
get(key) {
return new Promise((resolve, reject) => {
// If value2 resolver already ran.
if (this.cache[key]) {
return resolve(this.cache[key]);
}
// If value2 resolver has not already run.
this.on(key, (val) => {
resolve(val);
});
})
}
put(key, value) {
this.cache[key] = value;
this.emit(key, value);
}
}
を持っていたと仮定します。
value1Resolver: (parent, args, context, info) => {
return context.cacheEmitter.get('value2').then(val2 => {
doSomethingWithValue2();
});
}
value2Resolver: (parent, args, context, info) => {
return doSomethingToFetch().then(val => {
context.cacheEmitter.put('value2', val);
return val;
}
}
私はそれを試していないが、それは私にはうまくいくかもしれないようだ!あなたがそれを撃つならば、私はそれがうまくいくかどうか分かります。ブックを保持するためには、 'CacheEmitter'クラスをインスタンス化し、それをトップレベルのGraphQLコンテキストにフィードする必要があります。
希望するもの:
何が必要ですか?おそらくあなたのAPIの設計に問題があります。 –
私は、neo4jデータベースからデータをフェッチする大きなスキーマを持っています。各エンティティ(User、Item/Productとしましょう)に対して、私はCypherクエリブロックを作成しました。各エンティティには、データに基づいていくつかの計算フィールドがあります。 私は 'User'エンティティを持っています。彼はリゾルバがdbから生データを取得し、彼のアドレス、年齢、およびその他のパラメータによって 'ランク'を計算します。 これで、計算された項目 - 価格、最終価格を計算するためにユーザランクを使用する を持つ商品/商品実体が得られました。 – alonp99
まあ、何かが 'User'に属していれば、DBや計算では' User'のプロパティでなければなりません。兄弟ではありません。親の解決された値は、常に内部の解決で得ることができます。 –