2017-07-31 20 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)) 
相关问题