在observable构造函数中使用一个可观察对象



我现在有一个函数返回一个看起来有点像这样的可观察对象:

public foo<T>(): Observable<T> {
// Execute some instructions X, Y and Z
return this.http.get<T>(...);
}

基本上,函数会在返回一个可观察对象之前执行一些指令,然后返回一个http调用。

我的问题是,如果我这样做:

const x$ = foo<Type>();

它不会执行http调用(这是正常的,因为我不订阅可观察对象),但是,它将执行指令X, Y和z。

我想要的是只在订阅可观察对象时执行这些指令,然后从http调用中发出值。到目前为止,我所做的是:

public foo<T>(): Observable<T> {
return new Observable<T>(observer => {
// Execute some instructions X, Y and Z
const subscription = this.http.get<T>(...).subscribe(observer);
return { 
unsubscribe: subscription.unsubscribe
}
}
}

这是有效的,但我觉得有些地方是错误的,我可以用更好的方式。

有什么推荐的方法来实现这一点吗?

您可以使用tap操作符执行您的副作用:

public foo<T>(): Observable<T> {
return this.http.get<T>(...).pipe(
tap(response => { 
// Execute some instructions X, Y and Z
})
);
}

但是,上面的代码只会在收到http响应后执行x, y, z。

如果您需要在http调用之前发生x, y, z,您可以这样做:

public foo<T>(): Observable<T> {
return of(undefined).pipe(
tap(() => { 
// Execute some instructions X, Y and Z 
}),
switchMap(() => this.http.get<T>(...))
);
}

这里我们使用of来制造一个发射undefined的可观测对象,然后使用switchMap来进行http调用并发射http发射。

最新更新