2016-07-04 7 views
0

を解決するために2つのサブスクリプションを必要とする変数を処理するために、私は流星/ NG2:

this.subscribe('a',() => {this.allA = A.find();}); 
this.subscribe('b',() => {this.allB= B.find();}); 

そして

、このようなロジックをに置くこと
let x = *take the first A, do some calculation to get the B linked, return B* 

のようなものである変数があるとしサブスクリプション 'a'と 'b'が解決されたときにのみこれが処理されることを確認してください。

ゾーンを使用している可能性がありますが、@コンポーネントで行うには最良の方法が100%ではありません。

PS:- - サーバーサイド・メソッドを実行しないよう:D

よろしく

+0

鉄:ルータのwaitOnは、複数のサブスクリプションを待つこのようなロジックを提供します。私は鉄のルータを使用していません。 – ATX

答えて

0

あなたは '組み合わせ' obsevablesにforkJoinを使用することができます。ここhttps://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

var rx = Observable.forkJoin(
    this.map(...), 
    this.map(...)) 

rx.subscribe(x => x.find()) 

詳細と例

しかし、質問はあいまいであり、それがどのような技術を参照しているのかははっきりしていません。代わりにあなたのサブスクリプションでコールバックを使用しての

+0

質問タグを使用すると、どの技術が使用されているかを正確に知ることができますが、混乱を避けるために詳細を追加します。 – ATX

1

、サブスクリプションのハンドルを返し、その後、彼らのready()状態を確認してください。今オートランでそれをラップする(例えばMeteorComponent)であるために

const subA = this.subscribe('a'); 
const subB = this.subscribe('b'); 
const that = this; 

Tracker.autorun(()=>{ 
    if (subA.ready()) that.allA = A.find(); 
    if (subB.ready()) that.allB = B.find(); 
    if (subA.ready() && subB.ready()) { 
    let x = ... //compute x 
    } 
}); 
+0

私が間違っている場合は私を訂正してください。しかしあなたの例では、どの行もブロックしていません。したがって、.ready()に到達すると、結果はfalse(サブスクライブの直後に呼び出されます)になります。準備ができていない限り、それを実行するにはsetTimeoutに入れますか? – ATX

+1

あなたの答えで行ったように、自動実行でそれをラップすると、計算が反応するようになります。 –

0

ソリューションは思わ

this.autorun(()=>{ 
    let s1 = this.subscribe('a',() => {this.allA = A.find();}); 
    let s2 = this.subscribe('b',() => {this.allB= B.find();}); 

    if(s1.ready() && s2.ready()) 
    ...