首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用RxJ在Angular中按顺序执行一个后端调用并重试

使用RxJ在Angular中按顺序执行一个后端调用并重试
EN

Stack Overflow用户
提问于 2020-09-11 16:22:22
回答 1查看 52关注 0票数 0

我有一些Javascript代码,可以通过API调用从数据库中删除文档。文档之间存在内部依赖关系,因此删除操作可能会失败。因此,代码将尝试在5轮中删除所有文档。

但由于我使用的是Angular,并且使用RxJs完成所有其他任务,所以如果使用RxJs解决方案,而不是异步/等待和承诺,那就更好了。我已经设法用concatMap删除了一轮,但是如何让重试到位呢?

代码语言:javascript
运行
复制
private async deleteDocuments(documents: IDocument[]) {
    let retries = 5;
    let remaining = [...documents];
    while (remaining.length > 0 && retries > 0) {
        remaining = await this.deleteDocumentsOneTry(remaining);
        retries--;
    }
}

private async deleteDocumentsOneTry(documents: IDocument[]) {
    const remaining: IDocument[] = [];
    for (const document of documents) {
        const deleted = await this.deleteDocument(document);
        if (deleted) {
            this.documentsDeleted++; // For progress bar
        } else {
            remaining.push(document);
        }
    }

    return remaining;
}

private deleteDocument(document: IDocument) {
    console.log(`Delete document ${document.name}`);
    return this.backend
        .deleteDocuments(document.id)
        .pipe(
            map(() => true),
            catchError(() => of(false))
        )
        .toPromise();
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-11 20:36:49

考虑实现它,如下所示:

代码语言:javascript
运行
复制
return from(documents).pipe(
  mergeScan((failed: number, document: IDocument) => {
    return that.backend.deleteDocuments(document.id).pipe(
      tap(x => this.documentsDeleted++),
      mapTo(failed),
      catchError((error, source) => failed < 5 ? source.pipe(mapTo(++failed)) : throwError(error))
    )
  }, 0)
)

简化的实施:

代码语言:javascript
运行
复制
let retries = 5;

from(documents).pipe(
  concatMap(doc => that.backend.deleteDocuments(doc.id).pipe(
    catchError((error, source) => --retries > 0 ? source : throwError(error)),
  ))
).subscribe((x) => this.documentsDeleted++)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63843387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档