gpt4 book ai didi

RxJS:即使在源 observable 上使用 `shareReplay()`, `throwError()` 也会为每个 observable 单独执行

转载 作者:行者123 更新时间:2023-12-04 09:57:51 27 4
gpt4 key购买 nike

我正在使用 RxJS shareReplay()可观察对象( courses$ )上的运算符,以在其他两个可观察对象( beginnerCourses$advancedCourses$ )之间共享可观察流。它工作正常,成功时在两个可观察对象之间共享单个 API 调用响应。

但是,当涉及到错误时,这些 observable 不会共享错误,并且在浏览器控制台中会看到错误被抛出两次。没有 shareReplay()运营商也分享错误?这是预期的行为吗?

const http$ = createHttpObservable('/api/courses');

const courses$ = http$
.pipe(
map(res => res['payload'] ),
shareReplay(),
catchError(err => {
return throwError(err);
})
);

this.beginnerCourses$ = courses$
.pipe(
map(courses => courses
.filter(course => course.category === 'BEGINNER')));

this.advancedCourses$ = courses$
.pipe(
map(courses => courses
.filter(course => course.category === 'ADVANCED')));

}

最佳答案

当 observable 抛出错误时,这是​​预期的行为,shareReplay() 将尝试重新订阅/重新执行源

你可以试试这个来验证

const a=defer(()=>{
console.log('run')
return throwError(new Error('Error'))
}).pipe(shareReplay())

a.subscribe(console.log,console.error,()=>console.log('complete'))
a.subscribe(console.log,console.error,()=>console.log('complete'))

https://stackblitz.com/edit/typescript-jutfxe

如果您希望 observable 在不再次执行的情况下共享错误
使用 publishReplay(1),refCount()反而

关于RxJS:即使在源 observable 上使用 `shareReplay()`, `throwError()` 也会为每个 observable 单独执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61884807/

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