未调用可观察订阅

编程入门 行业动态 更新时间:2024-10-18 19:22:25
本文介绍了未调用可观察订阅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个 Observable,用于将承诺转换为订阅.这会生成一个集合,我需要遍历该集合以在每个元素上调用 HTTP 服务.我正在使用 forkJoin 等待所有这些调用完成,以便我可以做其他事情,但不幸的是,我的订阅没有被调用.你看到我在这里遗漏了什么吗?

I have an Observable that I'm using to convert a promise into a subscription. This results in a collection that I need to iterate through to call an HTTP Service on each element. I'm using forkJoin to wait for all those calls to finish so that I can do something else, but unfortunately, my subscription is not being called. Do you see what I'm missing here?

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.操作员必须自己做.

One thing is you don't subscribe to each Observable passed to forkJoin(). The operator has to do it itself.

如果你想在每个 Observable 完成时收到通知,你可以使用 .do(undefined, undefined, () => {...}).

If you want to be notified when each Observable completes you can use .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() 不同.

Eventually there's also .finally() operator. However, it's not the same as using .do().

当任何源 Observables 失败时,forkJoin() 操作符会重新发出错误(这意味着它也失败了).这意味着您需要分别捕获每个源 Observable 中的错误(例如使用 catch() 运算符).

When any of the source Observables fail the forkJoin() operator reemits the error (which means it also fails). This means you need to catch errors in each source Observable separately (with catch() operator for example).

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 ]

更多推荐

未调用可观察订阅

本文发布于:2023-11-27 23:32:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1640044.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!