2017-07-31 40 views
1

我有一個觀察數組。每個observable都是需要通過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>

此代碼將上傳所有文件並對每個完成的observable執行this.onSuccess.emit(data)

現在的問題是:如何在完成所有工作後將this.isUploading$設置爲false

UPDATE:

我想實現這樣的事情,但沒有在onCompleted功能分配變量。例如:

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

我想檢索兩個觀察對象,然後在我想要的時候訂閱它們。

回答

0

你可以簡單地用一個BehaviorSubject吧:

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

在那裏我有打電話給'this.isUploading $。接下來(真);'?我如何知道所有文件都上傳了? – 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'變化檢測策略時,這會讓你陷入一些麻煩。 – cyrix

0

:我不喜歡這樣。您可以使用doforkJoin運算符來完成這兩件事。

forkJoin基本上是Promise.all的可觀察量。

do是一種挖掘傳遞的值和可觀察值的方法,因此您可以用它們「做」某些事情(副作用)。

所以:

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)) 
相關問題