[英]Observable subscription not getting called
我有一个Observable,用于将诺言转换为订阅。 这导致我需要迭代一个集合以在每个元素上调用HTTP服务。 我正在使用forkJoin等待所有这些调用完成,以便我可以做其他事情,但是不幸的是,我的订阅没有被调用。 你看到我在这里想念的吗?
Observable.fromPromise(this.users.getElements()).subscribe(results => {
Observable.forkJoin(
results.map(
aUser => this.HttpService.submitUser(aUser).subscribe(
results => {
this.progress += 1;
},
err => {
this.progress += 1;
this.handleError(<any>err);
})
).subscribe(
//it never gets to either of these calls after all service calls complete
data => {
debugger;
console.log(data);
this.reset();
},
err => {
debugger;
console.log(err);
this.reset();
}
));
});
一件事是您不订阅传递给forkJoin()
每个Observable。 操作员必须自己做。
如果要在每个Observable完成时收到通知,则可以使用.do(undefined, undefined, () => {...})
。
let observables = [
Observable.of(42).do(undefined, undefined, () => console.log('done')),
Observable.of('a').delay(100).do(undefined, undefined, () => console.log('done')),
Observable.of(true).do(undefined, undefined, () => console.log('done')),
];
Observable.forkJoin(observables)
.subscribe(results => console.log(results));
打印到控制台:
done
done
done
[ 42, 'a', true ]
最终还有.finally()
运算符。 但是,它与使用.do()
。
编辑:
当任何源Observable失败时, forkJoin()
运算符将重新forkJoin()
错误(这意味着它也将失败)。
这意味着您需要分别捕获每个Observable源中的错误catch()
例如,使用catch()
运算符)。
let observables = [
Observable.throw(new Error())
.catch(() => Observable.of('caught error 1'))
.do(undefined, undefined, () => console.log('done 1')),
Observable.of('a')
.delay(100).catch(() => Observable.of('caught error 2'))
.do(undefined, undefined, () => console.log('done 2')),
Observable.of(true)
.catch(() => Observable.of('caught error 3'))
.do(undefined, undefined, () => console.log('done 3')),
];
Observable.forkJoin(observables)
.subscribe(results => console.log(results));
哪些打印:
done 1
done 3
done 2
[ 'caught error 1', 'a', true ]
我认为您不需要订阅地图。
Observable.fromPromise(this.users.getElements()).subscribe(results => {
Observable.forkJoin(
results.map(
aUser => this.HttpService.submitUser(aUser))
).subscribe(
//it never gets to either of these calls after all service calls complete
data => {
debugger;
console.log(data);
this.reset();
},
err => {
debugger;
console.log(err);
this.reset();
}
));
});
请注意,在此处的rxjs示例中:
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md
他们不订阅各个可观察对象-ForkJoin使它们全部进行,然后等待它们全部返回(在您的订阅中)。
编辑:
forkjoin源在这里:
https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoin.js
而且看起来好像没有钩子可以确定何时完成。 我认为,处理UI栏的最佳方法是分别订阅每个映射的可观察对象,它们都调用一个函数来增加UI计数栏变量并进行一些“完整性”测试,以允许您使用数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.