我有一些Javascript代码,可以通过API调用从数据库中删除文档。文档之间存在内部依赖关系,因此删除操作可能会失败。因此,代码将尝试在5轮中删除所有文档。
但由于我使用的是Angular,并且使用RxJs完成所有其他任务,所以如果使用RxJs解决方案,而不是异步/等待和承诺,那就更好了。我已经设法用concatMap删除了一轮,但是如何让重试到位呢?
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();
}
发布于 2020-09-11 20:36:49
考虑实现它,如下所示:
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)
)
简化的实施:
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++)
https://stackoverflow.com/questions/63843387
复制相似问题