2017-07-31 7 views
1

私は観測値の配列を持っています。各観測対象は、HTTP要求を介してアップロードする必要のあるファイルです。私は親コンポーネントで処理されるイベントを放出する必要がアップロードされた各ファイルについてすべての観測値が完了したときに通知する

  1. 私は二つのことをしたいです。

  2. すべてのファイルがアップロードされると、すべての観測対象が完了したという通知が返されます。

私はこのコードを開始しました:

this.isUploading$ = Observable.of(true); 

const source$ = Observable.from(files) 
    .concatMap(file => this.uploadSingleFile(file)); 

source$.subscribe(data => this.onSuccess.emit(data)); 

観察可能isUploading$は、アップロードプロセスが開始され、それがHTMLで消費されていることを表しています。私はisUploading$の状態に基づいてスピナーを表示したいと思います。

観察可能なファイルsource$は、ファイルthis.uploadSingleFile(file)の戻り値がObservable<Response>であるため、ファイルのアップロード操作を表します。

このコードでは、すべてのファイルがアップロードされ、完了した各観察可能ファイルにthis.onSuccess.emit(data)が実行されます。

問題は次のとおりです。すべてが完了したらthis.isUploading$falseに設定できますか?

UPDATE:

私はこのようなもののonCompleted関数内で変数を割り当てずに何かを達成したいと思います。例:私は2つの観測を取得し、私はいつでも、後でそれをサブスクライブしたい

source$.subscribe(data => this.onSuccess.emit(data), 
        err => console.log(err), 
       () => this.isUploading = false); 

あなたは単にそれのため BehaviorSubjectを使用することができます

答えて

0

:...

public isUploading$ = new BehaviorSubject<boolean>(true); 

this.isUploading$.next(false); 
this.isUploading$.complete(); 

を、完了するまで、すべてを待つforkJoin演算子を使用します。

const allSources$ = Observable.forkJoin(source$); 
allSources$.subscribe(data => { 
    this.isUploading$.next(false); 
    this.isUploading$.complete(); 
} 

これでしょうあなたに望ましい結果を与えてください。

+0

;'?すべてのファイルがアップロードされていることをどのように知っていますか? – kat1330

+0

'this.onSuccess.emit'を呼び出すと同時に呼び出します。 – cyrix

+0

'this.onSuccess.emit'が各観測対象に対して実行されます。すべての操作が完了したときにのみ 'false'を設定したいと思います。 – kat1330

1

なぜisUploadingを観測可能にする必要がありますか?あなたは、同時にこれらの観測のすべてを実行したい場合は、concatMapはあなたがやりたいことはありません

this.isUploading = true; 
const source$ = Observable.from(files) 
    .concatMap(file => this.uploadSingleFile(file)); 

source$.subscribe(data => this.onSuccess.emit(data), 
        err => console.log(err), 
       () => this.isUploading = false); 
+0

私はobservablesの中で 'this.isUploading'の状態を変更したくありません。私は可能であれば観測可能に変換したいと思います。 'onCompleted'関数でfalseを代入するのではなく、それを行う他の方法はありますか? – kat1330

+0

また、これは 'OnPush' changedetection-strategyを使用するときにいくつかの問題を引き起こします。 – cyrix

0

:私はこのようにそれを行うだろう。 doforkJoinの演算子でこれらの2つのことを実行できます。

forkJoinは、観測値の場合、基本的にはPromise.allです。

doは、渡されて観測可能な値にタップする方法です。そのため、それらで何かを「行う」ことができます(副作用)。だから、

:私は(真) `this.isUploading $ .next呼び出す必要があり

const arrayOfObservables = [observable1, observable2, observable3]; 

Observable.forkJoin(
    arrayOfObservables.map((obs, i) => obs.do({ 
    next(value) { console.log(`Observable ${i} emits: ${value}`); }, 
    complete() { console.log(`Observable ${i} is complete`); } 
    })) 
) 
.subscribe(values => console.log('everything done with', values)) 
関連する問題