Angular 2承诺/可观察链两个事件?

时间:2016-02-15 07:33:43

标签: angular

我想知道可观察承诺是否可用于角度2中的以下用例:

有两个异步上传任务。我想知道如何检测到这两项任务都已完成。

我的上传任务(在承诺中实施,但如果需要,可以轻松更改为可观察)如下所示:

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

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

如何将这两个事件链接在承诺 observable 中,以便我知道这两个任务都已完成?感谢

4 个答案:

答案 0 :(得分:7)

您可以使用Combining Operators之一的observable。例如,Observable.zip()适用于承诺......

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

zip接受一个可变数量的Observables或Promises作为参数,后跟一个函数,该函数接受每个Observable发出的一个项目或由这些Promises作为输入解析,并生成一个由项目发出的单个项目。结果是Observable。

答案 1 :(得分:7)

使用forkJoin,相当于Angular 1.x的$ q.all(a和b是可观察的):

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

答案 2 :(得分:5)

complete在所有源流关闭时执行。

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

如果要设置等待的最大结果数

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

答案 3 :(得分:2)

你可以使用Promise.all,它返回一个新的Promise,它在参数数组中的所有promise都已解析时解析。

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

注意,如果你的myService.upload方法返回了Promise而不是Promise,你可以通过这种方式访问​​返回值:

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