Я довольно новичок в rxjs и у меня возникают проблемы с поиском правильного ответа на эту проблему в документах и stackOverflow.Любая помощь в том, как правильно структурировать этот код, будет принята с благодарностью.
У меня есть довольно типичное приложение Angular, которое извлекает данные из серверной части для нескольких элементов, выбранных пользователем.Для каждого выбранного элемента сервер должен просмотреть некоторые данные в s3, объединить файлы и отправить результат tar.gz в виде строки в кодировке base64.
Этот результат затем сохраняется во внешнем интерфейсе.
Все это работает хорошо, но я бы хотел иметь возможность "сохранить" параметр id
перед вызовом API и использовать его позже в методе subscribe
при записи реальных данных.Смотрите код ниже
Спасибо!
Я мог бы использовать concatAll
, но я бы хотел остаться с mergeMap
по соображениям производительности ...
// i set up the observable from the items that a user has selected
// each item has an id property
function fetch(): void {
let itemId;
from(this.selection.selected)
.pipe(
take(this.selection.selected.length),
tap((item) => itemId = item.id),
mergeMap((item: ItemType): any => {
return this.fetchMoreDataForItem(item);
})
)
.subscribe((apiResponse: any) => {
const blob = this.decodeBlob(apiResponse);
/* would love to somehow retain the itemId of the fetched
item here, but of course using 'itemId' from the 'tap'
call will not work as the mergeMap has already moved
on to the next API call before the subscription is
triggered... */
this.saveBlobToFile(blob, <WOULD LOVE TO HAVE ITEM ID HERE>);
},
(err) => console.error(`Error fetching ${err.stack}`),
() => {
console.log('Completed download');
});
}