在 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 发射。