2016-02-15 63 views
5

観測可能または約束は角2で以下のユースケースで使用することができる場合、私は思ったんだけど:角度2の約束/観測可能なチェーン2イベント?

2つの非同期アップロードタスクがあります。私はどのように私は両方のタスクを検出することができます知りたいのですが完了です。

マイアップロードタスク(約束に実装されますが、必要であれば、それは簡単にに観察に変更されます)は、このようなものです:

約束または のいずれかで一緒にこれらの2つのイベントがチェーンにどのよう
myService.upload('upload1').then(() => { 
}) 

myService.upload('upload2').then(() => { 
}) 

私は両方のタスクが完了している知っているので、を観察する?ありがとう

答えて

5

completeで動作が実行されます。

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2').subscribe({complete:() => { ... }); 

あなたはアンギュラ1.xから$ q.allと同等です

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2') 
.take(2) 
.subscribe({complete:() => { ... }); 
+0

をしかし、エラーメッセージました: ***元の例外を:ReferenceError:変数を見つけることができません:Rx *** –

+0

このようなものです:*** myService1.merge(myService2).subscribe()***。しかし、これは私が望むものではありません。私が望むのは、最後のイベントを得ることです。 –

+0

最後のイベントが必要か、最後のイベントがいつ起こったか、つまり完了したことを知りたいだけですか?(イベントの後にソースオブザーバブルが送信者によって閉じられている場合のみ動作します) –

7

Combining Operatorsのいずれかを観測値とともに使用できます。すべてのソースストリームが閉じているときObservable.zip()、例えば、約束...

Observable.zip(
    first, 
    second, 
    function (firstResolvedValue, secondResolvedValue) { 
     return firstResolvedValue && secondResolvedValue; 
    } 
) 

zip accepts a variable number of Observables or Promises as parameters, followed by a function that accepts one item emitted by each of those Observables or resolved by those Promises as input and produces a single item to be emitted by the resulting Observable.

7

使用forkJoin、(a、bは観測されている)を待つ結果の最大数を設定したい場合:

Rx.Observable.forkJoin([a,b]).subscribe(t=> { 
     var firstResult = t[0]; 
     var secondResult = t[1]; 
}); 
2

あなたは引数配列内の約束のすべてが解決したときに解決する新しい約束を返すPromise.allを使用することができます。

Promise.all([myService.upload('upload1'), myService.upload('upload2')]).then(() => { 
    // ... 
}); 

注意、あなたのmyService.upload方法は約束ではなく、約束を返した場合は、戻り値をこのようにアクセスできます。

Promise.all([myService.upload('upload1'), myService.upload('upload2')]) 
    .then((retValue1, retValue2) => { 
    // ... 
}); 
関連する問題