如何在角度4中跨订阅者制作可观察的份额?

如何在角度4中跨订阅者制作可观察的份额?

问题描述:

考虑下面的代码如何在角度4中跨订阅者制作可观察的份额?

getObservable() { 
    return this.http.get('get_something').map(
     data => { 
      return true; 
     }, 
     err => { 
      return false; 
     } 
    ); 
} 

subscriber_1 = this.getObservable().subscribe(
    data => { 
     console.log("from subscriber 1", data); 
    } 
); 

subscriber_2 = this.getObservable().subscribe(
    data => { 
     console.log("from subsriber 2", data); 
    } 
); 

for (var _i = 0; _i < 100; _i++) { 
    this.getObservable() 
} 

我希望from subscriber 1from subsriber 2获得打印100倍。但是,它只打印1时间。

我认为observables是矢量而不是标量,所以无论何时,同一个observable被调用,它会调用所有的订阅者?

我一定在做错事。

有人可以帮忙吗?

感谢

+0

由于您正在调用您的函数两次,所以您在返回语句中调用了您的请求两次。你应该让你的类的一个成员变成一个'* Subject'类型,你可以指定它,然后向它推送值来通知观察者。 –

+0

你可以显示你的控制台输出的屏幕截图吗? (只是想确保在输出在控制台中重复输出时,在同一行上不会看到输出内的'计数'增加为'气泡') – amal

这里是你做什么:

  1. 创建它创建了一个请求,并返回一些值的函数。
  2. 第一个订户subscriber_1正在发出请求,当您调用订阅功能时,仅等待当前请求接收响应。
  3. 当你做循环时,你只是提出一个请求。你没有做任何事情来处理对这些请求的回应。

到目前为止,我所了解的您想要使用RxJS的Subject

let subject: Subject<any> = new Subject<any>(); 

// Anytime the subject value is changed a notification is triggered 
// The subscribe function is handling it 
let subscriber_1 = subject.AsObservable().subcribe((data) => { 
    console.log(data); 
    return data; 
}) 

// Trigger a notification 100 times 
for(let i = 0; i < 100; i++) { 
    subject.next(i); 
} 

这里是一个很好的文章,你可以了解更多关于Subjecthttps://medium.com/@benlesh/on-the-subject-of-subjects-in-rxjs-2b08b7198b93

或者

如果你不想使用RxJS你必须实现可观察到的模式。

http://www.dofactory.com/javascript/observer-design-pattern下面是一个很好的例子。