我有一个Angular 5服务,我希望有一个可观察到的动态数据,让我们调用它们,来电者。注入此服务的任何组件都可以获得一个观察者/主题/任何内容,使用它来呈现自己" on"或者"关闭" (真/假,无论如何),完成后,完成。它可以多次这样做。
我的服务还应该公开一个BehaviorSubject,它传递所有这些值。我该怎么办呢?例如:
@Injectable() class MyService {
results$: BehaviorSubject<any> = new BehaviorSubject<any>(true);
callers: any[] = [];
getSubject() {
const subject = new Subject();
callers.push(subject);
// TODO: Now what? How to tell result$ to listen to this new one too?
subject.finally(() = {
// TODO: Now what? How to kick it out of the array when complete, and tell results$?
});
return subject;
}
编辑每条评论请求,例如,典型的消费者可以这样做:
@Component({
selector: 'my-comp',
template: '<button (click)="doWork()">Do work</button>'
})
export class MyComponent {
constructor(private myService: MyService,
private otherService: OtherService
) {}
doWork() {
// grab the semaphore instance
const semaphore = myService.getSubject();
// Kick off the semaphore and start some async activity (http call in my case)
semafore.next('on');
otherService.doAnotherWork()
.subscribe(() => semaphore.complete());
}
}
正如您所看到的,其他服务可以做两件事情:
我可以在页面上同时拥有多个此类消费者。
(现在我想到了这一点,我可能应该考虑一些清理逻辑,例如用户在中途处理时导航。)