RxJs主题:获取发射器

时间:2018-06-25 08:19:50

标签: angular typescript rxjs

我正在与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"
});

2 个答案:

答案 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);
});

因此,“类型”是您自己选择的,并且非常健壮且没有错误,因为您始终会事先知道这些值。您不会破解自己的方式。