在 Observable 构造函数中使用一个 observable
Use an observable from within Observable constructor
我目前有一个函数返回一个看起来有点像这样的可观察对象:
public foo<T>(): Observable<T> {
// Execute some instructions X, Y and Z
return this.http.get<T>(...);
}
所以基本上,该函数在返回进行 http 调用的可观察对象之前执行一些指令。
我的问题是,如果我这样做:
const x$ = foo<Type>();
它不会执行 http 调用(这很正常,因为我没有订阅 observable),但是,它会执行指令 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
to fabricate an observable that emits undefined
, then use switchMap
进行 http 调用并发出 http 发射。
我目前有一个函数返回一个看起来有点像这样的可观察对象:
public foo<T>(): Observable<T> {
// Execute some instructions X, Y and Z
return this.http.get<T>(...);
}
所以基本上,该函数在返回进行 http 调用的可观察对象之前执行一些指令。
我的问题是,如果我这样做:
const x$ = foo<Type>();
它不会执行 http 调用(这很正常,因为我没有订阅 observable),但是,它会执行指令 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
to fabricate an observable that emits undefined
, then use switchMap
进行 http 调用并发出 http 发射。