2016-09-21 70 views
0

好吧,这是一个快速的,我已经有点疲惫了,并且困惑着我自己:DRxJs - (为什么)Observable是否会在新的subsription上发布它的最新值?

我正在使用angular2和RxJS Observables。

我有一个属性“数据”,这是获得在构造函数中设置可观察到的服务,并返回该观察的订阅方法。

export class test{ 
    private data: Observable<Object> 
    constructor(private http: Http){ 
     this.data = this.http.get(url).map(res => res.json()); 
    } 
    getData(): Observable<Object>{ 
     return this.data 
    } 
} 

前段时间,我已经很聪明地回放了一些主题,以便始终将新序列的所有值发送给新的订阅者。然而,随着Observable上面的代码似乎将它发布给新用户的最新价值。这是打算?

test(i: number) { 
     if (i > 0) { 
     setTimeout(() => { 
      this.dataService.getData().subscribe((data) => { 
      this.debug.log(data); 
      this.test(i-1); 
      }); 
     }, 2000); 
     } 
    } 
test(4) 

我得到每个迭代的值。我很困惑,因为一年前,当我想要这种行为时,在订阅“太晚”时我没有任何新的价值。从本质上讲,我只想缓存http.get的结果,并为所有订阅者提供相同的值,而不是为每个订阅创建一个新的http请求(在getData()中返回http.get(url)..) )

+0

请问'this.http.get(url).map(res => res.json()).share()'做你想做的事情吗? – estus

+0

我很困惑。你说观察员正在发布新用户的最后价值,你似乎并不喜欢。然后你说这就是你想要的。它是什么? – acdcjunior

+0

对不起,在电话里,累了,.....是的,它表现了我想要的方式。我只是不确定它是否有意,因为一年前它没有这样工作(或者至少我认为)。我想我应该再次阅读观察对象,当我有时间后 – ch40s

回答

0

号您需要使用Subject这一点。它有一个方法next()你将发送你新到的属性,以便它推送给用户。

除此之外,您应该创建一个单身服务。只要你的组件在构造函数中实例化它们,它们就会收到已经与所有数据一起形成的对象。每次都不需要获取数据。

此外,而不是在构造函数实例化数据,实现OnInit并从那里做呼叫服务器。

+1

这是一个服务(this.dataService.getData()),因为我使用ng2 DI它是我的应用程序范围的单身。由于服务没有视图/数据绑定的输入,我认为使用构造函数可以吗? – ch40s

+0

是的,你是对的。 –

1

我知道这个问题有点老,但答案在我看来很混乱。

从方法getData()返回的Observable就是那个,一个Observable。所以每当消费者订阅它时都会得到回应。所以它工作正常,但它确实每次都提出新的要求。

为了缓存结果,有很多方法可以根据你想要的行为来完成。只是缓存一个请求,我会建议运用互联网#publishBehavior操作:

export class test{ 
    private data: Observable<Object>; 
    constructor(private http: Http){ 
    this.data = this.http.get(url) 
     .map(res => res.json()) 
     .publishBehavior([]) 
     .refCount(); 
    } 
    getData(): Observable<Object>{ 
    return this.data; 
    } 
} 

传递给publishBehavior的参数是初始值。有了这两个操作员,请求将在第一个用户到达时进行。下一个订户将获得缓存的答案。

在其他人回答建议使用主题。 publishBehavior在底层使用主题。但要直接调用next(),除非没有其他补救措施,否则它被认为是不好的做法,在我看来,这种情况并非如此。即使直接使用Subjects,通过使用#asObservable()运算符将Observable返回给组件也是明智的,因此组件将无法访问下一个错误和完整的方法。

相关问题