Похоже, вы хотите иметь своего рода механизм "кэширования", чтобы избежать повторного вызова внутреннего API и сокращения результата для каждого подписчика.
Один из способов сделать это - использовать shareReplay(1)
оператор.Он буферизует столько уведомлений, сколько указано в значении параметра, и отправляет их каждому новому подписчику сразу же при подписке.При значении, равном 1, оно отправляет последнее полученное уведомление, превращая его в своего рода «кеш» (который раньше был именем оператора, но у фактического кеша гораздо больше параметров конфигурации).
С вашим кодом это будет:
this._books$ = this.backendService.getBookDtosByCategory(this._bookCategoryRid).pipe(
scan<AssetSearchResultItem[], string[]>((acc, curr) => {
const v = curr.map(val => val._name);
return acc.concat(v);
} , []),
shareReplay(1)
);