我想知道可观察或承诺是否可用于角度2中的以下用例:
有两个异步上传任务。我想知道如何检测到这两项任务都已完成。
我的上传任务(在承诺中实施,但如果需要,可以轻松更改为可观察)如下所示:
myService.upload('upload1').then(() => {
})
myService.upload('upload2').then(() => {
})
如何将这两个事件链接在承诺或 observable 中,以便我知道这两个任务都已完成?感谢
答案 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) => {
// ...
});