如何在角度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 1
和from subsriber 2
获得打印100
倍。但是,它只打印1
时间。
我认为observables是矢量而不是标量,所以无论何时,同一个observable被调用,它会调用所有的订阅者?
我一定在做错事。
有人可以帮忙吗?
感谢
答
这里是你做什么:
- 创建它创建了一个请求,并返回一些值的函数。
- 第一个订户
subscriber_1
正在发出请求,当您调用订阅功能时,仅等待当前请求接收响应。 - 当你做循环时,你只是提出一个请求。你没有做任何事情来处理对这些请求的回应。
到目前为止,我所了解的您想要使用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);
}
这里是一个很好的文章,你可以了解更多关于Subject
类https://medium.com/@benlesh/on-the-subject-of-subjects-in-rxjs-2b08b7198b93
或者
如果你不想使用RxJS你必须实现可观察到的模式。
http://www.dofactory.com/javascript/observer-design-pattern下面是一个很好的例子。
由于您正在调用您的函数两次,所以您在返回语句中调用了您的请求两次。你应该让你的类的一个成员变成一个'* Subject'类型,你可以指定它,然后向它推送值来通知观察者。 –
你可以显示你的控制台输出的屏幕截图吗? (只是想确保在输出在控制台中重复输出时,在同一行上不会看到输出内的'计数'增加为'气泡') – amal