如何防止在 RxJS 中进行多次提取调用?
How to prevent multiple fetch calling in RxJS?
我有以下代码:
const fetchBook = (bookId: number) => {
const title = 'Book' + bookId;
console.log('fetch book:', title)
// mimic http request
return timer(200).pipe(mapTo({ bookId, title }));
}
const bookId$ = new Subject<number>();
const book$ = bookId$.pipe(
mergeMap(bookId => fetchBook(bookId))
);
book$.subscribe(book => console.log('subscriber1: ', book.title))
book$.subscribe(book => console.log('subscriber2: ', book.title))
bookId$.next(1);
控制台输出:
fetch book: Book1
fetch book: Book1 <--- called second time
subscriber1: Book1
subscriber2: Book1
在 RxJS 中防止多次提取的最佳做法是什么?
更新:我不使用Angular
Upd2:问题是由多个订阅者引起的
在 mergeMap()
之后添加 shareReplay(1)
。这将确保迟到的订阅者将从源可观察到的最后一个发射值。
我有以下代码:
const fetchBook = (bookId: number) => {
const title = 'Book' + bookId;
console.log('fetch book:', title)
// mimic http request
return timer(200).pipe(mapTo({ bookId, title }));
}
const bookId$ = new Subject<number>();
const book$ = bookId$.pipe(
mergeMap(bookId => fetchBook(bookId))
);
book$.subscribe(book => console.log('subscriber1: ', book.title))
book$.subscribe(book => console.log('subscriber2: ', book.title))
bookId$.next(1);
控制台输出:
fetch book: Book1
fetch book: Book1 <--- called second time
subscriber1: Book1
subscriber2: Book1
在 RxJS 中防止多次提取的最佳做法是什么?
更新:我不使用Angular
Upd2:问题是由多个订阅者引起的
在 mergeMap()
之后添加 shareReplay(1)
。这将确保迟到的订阅者将从源可观察到的最后一个发射值。