gpt4 book ai didi

angular - RxJS subscribe inside subscribe with actions on error

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:39 28 4
gpt4 key购买 nike

我在 subscribe 中有带有 subscribe 的代码:

this.http.post('/update1', newData).subscribe(
(response) => {
const r = response.json;
const id = r['id'];
this.http.post('/update2?id=' + id, newData).subscribe(
() => {
this.http.post('/update3?id=' + id, newData).subscribe(
() => {
console.log('success');
},
() => {
// revert changes made to update2
this.http.post('/update2', previousValues).subscribe();
// revert changes made to update1
this.http.post('/update1', previousValues).subscribe();
});
},
() => {
// revert changes made to update1
this.http.post('/update1', previousValues).subscribe();
}
);
},
(error) => {
console.log(error);
}
);

如何在 RxJS 5 中对其进行优化?

最佳答案

请不要在另一个订阅中使用订阅。使用原生 RxJS 运算符,有更好的解决方法:

this.http
.post('/update1', newData)
.pipe(
map((response) => response.json),
map((data) => data.id),
switchMap((id) =>
this.http.post('/update2?id=' + id, newData).pipe(
switchMap(() => this.http.post('/update3?id=' + id, newData)),
catchError((err) => {
// this catcherror will happen if update3 failes
return merge(
// revert changes made to update2
this.http.post('/update2', previousValues),
// revert changes made to update1
this.http.post('/update1', previousValues),
);
}),
),
),
catchError((err) => {
// this catcherror will happen if update2 failes
// revert changes made to update1
return this.http.post('/update1', previousValues);
}),
)
.subscribe(
(result) => {
console.log(result);
},
(err) => {
// this error will happen if an error happens wich is not caught
console.log(err);
},
);

通过这种方式,您只有一种订阅方法可以根据需要处理最后剩余的结果。

请记住,如果异常在任何地方之前被触发,管道内的 catchError() 将被触发。如果处理程序已经处理了异常,则完全相同的异常将不会触发其他 catchError() 两次。

关于angular - RxJS subscribe inside subscribe with actions on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com