【问题标题】:Rxjs - Can't convert cold observable into a hot oneRxjs - 无法将冷的可观察到的转换为热的
【发布时间】:2017-02-01 19:43:18
【问题描述】:

所以我正在使用 Angular 2 并努力使 HTTP 请求可观察到,以便在多个观察者之间共享。更具体地说,我想分享所有响应类型,包括错误。

我试过这样:

return this._http.request(new Request(options))
  .map((res: Response) => this.refreshToken(res))
  .share()

然后

this.data.request()
  .map((response: Response) => (new financeiro.FetchCompletedAction(response)))
  .catch((error: any) => {
    console.log('lancamento-effects:');
    return Observable.of(new feedback.HttpRequestFailedAction(["Erro ao inserir lançamento"]))
  })

上面的这段代码应该发送一个错误动作,最终在用户屏幕上显示一条错误消息。

实际上这种情况发生了两次..

它还会在控制台上打印两次。

【问题讨论】:

  • 嘿。目前尚不清楚您的代码是如何组织的。您的第一段代码显示了this.data.request() 方法的主体?

标签: angular rxjs reactive-programming rxjs5


【解决方案1】:

这是一些代码 (Plunkr):

@Component({
  selector: 'my-app',
  template: `
    <button (click)="subscribe()">Subscribe</button>
  `
})
export class AppComponent {
  obs: Observable<any>;

  constructor(private http: Http) {
    // Create the observable ONCE + Share.
    this.obs = this.http.get('https://httpbin.org/get')
      .do(() => console.log('***SIDE EFFECT***'))
      .mapTo('***RESULT***')
      .share();
  }

  subscribe() {
    // Subscribe to the same observable TWICE.
    this.obs.subscribe(val => console.log('subs1', val));
    this.obs.subscribe(val => console.log('subs2', val));
  }
}

控制台显示如下:

***SIDE EFFECT***
subs1 ***RESULT***
subs2 ***RESULT***

一个副作用(即 HTTP 请求),两个订阅。

这就是你要找的吗?

【讨论】:

  • share() 在我的代码中不起作用。我们需要导入操作符来共享吗?
【解决方案2】:

确保每个订阅者都订阅了相同的 hot observable。每次调用:

return this._http.request(new Request(options))
  .map((res: Response) => this.refreshToken(res))
  .share()

你正在从一个冷的 observable 创建一个新的 hot observable。

假设上述代码被包装在一个名为 foo() 的函数中的示例:如果执行以下操作,您将创建 2 个 hot observables 和 2 个 http 请求:

foo().subscribe(...)
foo().subscribe(...)

而以下只会创建一个热可观察对象(和单个 http 请求):

let hotObs = foo();
hotObs.subscribe(...)
hotObs.subscribe(...);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多