首页 > 解决方案 > 为什么我的 http 请求取消/停止 observables 流?

问题描述

我有一个数组,applications我希望每个应用程序都有一个名为Blobs. 我必须发出一个新的 HTTP 请求来为每个应用程序获取 Blob,并为此使用switchMap它。但是,由于某种原因,它只发出最后一个应用程序,而不是每个应用程序。

(我知道不好的解释,但是当你阅读代码时你会明白的)

this.serviceOne.getAllApplications(visitId).pipe(
    switchMap((applications) => from(applications)),
    switchMap((application) => {
        console.log("successfully logs every application in applications array");
        return forkJoin([
            of(application),
            this.blobsService.getBlobBs({
                visitId,
                applicationId: application.id,
            }),
        ]);
    }),
    map(([application, blobs]) => {
        console.log("only logs on last emitted application");
        return { ...application, blobs };
    }),
    toArray()
)

它返回一个仅包含最后一个元素的数组(blob 属性已正确添加到最后一个对象中。)

每当我将 forkJoin 更改为此:

return forkJoin([
    of(application) ,
    of([])
]);

它开始正常工作。

获取 Blob:

getBlobBs(identifier: IIdentifier): Observable<BlobItem[]> {
    return this.http.get<BlobItem[]>(
        'service url goes here'
    )
}

标签: angulartypescriptrxjsswitchmap

解决方案


使用 mergeMap 而不是 switchMap。

switchMap 正在取消所有请求,仅处理最后一个请求。

switchMap:当新请求到达时取消当前订阅/请求。用于可取消的请求,例如搜索

mergeMap:并行运行订阅/请求。不要取消当前请求。顺序不重要时使用

concatMap:按顺序运行订阅/请求,性能较差。当顺序很重要时使用。它按顺序处理所有请求/订阅。

我认为在您的情况下 mergeMap 是合适的,因为您想对所有请求做出响应。


推荐阅读