我正在与Subjects一起工作,并且课程中有一个.subscribe()
。从其他不同的类中,我向该类发出值。问题在于订阅现在被触发了多次,我不知道发出的来源。
是否可以从触发发射(.next<T>
)的地方获取类或引用?
期望的行为:
在服务svc中:
obs: Subject<Date> = new Subject<Date>();
第1类:
svc.obs.next(new Date());
n类:
svc.obs.next(new Date());
订户:
svc.obs.subscribe((date) => {
console.log("Triggered from: " + svc.obs.getSource().classname); // Desired output: "Triggered from: SomeNamespace.Classname"
});
答案 0 :(得分:1)
您可以替换obs: Subject<Date> = new Subject<Date>();
由obs: Subject<any> = new Subject<any>();
然后您可以自己发射源
svc.obs.next({ date: new Date(), source: 'whatever source' });
最后订阅:
svc.obs.subscribe((data) => {
console.log("Triggered from: " + data.source + "Date is : "+data.date);
});
答案 1 :(得分:1)
解决此问题的一种干净方法就是这样做。
服务内部。
// First, declare an interface like so.
interface ReactiveDate {
date: Date,
type: String
}
// Instantiate the Subject using this interface as the generic type.
obs: Subject<ReactiveDate> = new Subject<ReactiveDate>();
在班级内部。
// From Class 1.
svc.obs.next({ date: new Date(), type: 'Class 1' });
// From Class 2.
svc.obs.next({ date: new Date(), type: 'Class 2' });
然后,再次在您的服务之内。
// Apply correct logic on "type" inside the subscribe callback.
obs.subscribe(({ date, type }) => {
console.log("Triggered from: " + type);
});
因此,“类型”是您自己选择的,并且非常健壮且没有错误,因为您始终会事先知道这些值。您不会破解自己的方式。