2017-01-11 11 views
1

いくつかの助けが必要です。次のデータを要求しているとしましょう:GraphQL:兄弟リゾルバからの別のリゾルバ/フィールド出力へのアクセス

{ 
    parent { 
    obj1 { 
     value1 
    } 
    obj2 { 
     value2 
    } 
    } 
} 

そして、計算のために値1のリゾルバの結果が必要です。

値2で約束を返すと思っていて、何とか値1のリゾルバで取りますが、値2のリゾルバがまだ実行されていないとどうなりますか?

これは何らかの方法で実行できますか?

+0

何が必要ですか?おそらくあなたのAPIの設計に問題があります。 –

+0

私は、neo4jデータベースからデータをフェッチする大きなスキーマを持っています。各エンティティ(User、Item/Productとしましょう)に対して、私はCypherクエリブロックを作成しました。各エンティティには、データに基づいていくつかの計算フィールドがあります。 私は 'User'エンティティを持っています。彼はリゾルバがdbから生データを取得し、彼のアドレス、年齢、およびその他のパラメータによって 'ランク'を計算します。 これで、計算された項目 - 価格、最終価格を計算するためにユーザランクを使用する を持つ商品/商品実体が得られました。 – alonp99

+0

まあ、何かが 'User'に属していれば、DBや計算では' User'のプロパティでなければなりません。兄弟ではありません。親の解決された値は、常に内部の解決で得ることができます。 –

答えて

1

私はすぐにコンテキストを使ってこのようなことを達成できると考えています。競合状態の問題を解決するために、オブジェクトのようなキャッシュをイベントエミッタと混在させることができると思います。例えば

、我々はあなたがこのような何かを行うことができ、あなたのリゾルバから次にいくつかのクラスに

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コンテキストにフィードする必要があります。

希望するもの:

+0

ありがとう、私はアイデアが好きです...もし私がその道を行くなら、私は依然としてクエリがvalue2を持たないケースを解決する必要があります。私はリゾルバを呼び出すことができますが、どうしてもすべての親リゾルバを呼び出す必要があります。また、graphqlからの応答がないことを約束するために人々が何をするかを考えさせました。もう一度ありがとう、私はそれを試してみましょう – alonp99

関連する問題