未调用可观察订阅 [英] Observable subscription not getting called

查看:63
本文介绍了未调用可观察订阅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 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 ]

这篇关于未调用可观察订阅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆