К
Катерина | Про Frontend
@katerina_profrontend3.1K подп.
1.2Kпросмотров
40.4%от подписчиков
23 декабря 2025 г.
Score: 1.4K
firstValueFrom vs lastValueFrom 🤨 В RxJS мы часто работаем с Observables — потоками данных. Иногда нужно получить одно значение из Observable как Promise, чтобы использовать async/await. Для этого есть firstValueFrom и lastValueFrom.😉 Немного теории: ✔️ firstValueFrom(obs$) — возвращает Promise, который резолвится при первом эмите и автоматически отписывается; ✔️ lastValueFrom(obs$) — возвращает Promise, который резолвится только после завершения Observable и содержит последний эмит до завершения. 👀 Что важно учитывать? 1️⃣ Если поток завершился без эмитов, оба метода reject’ят промис. Чтобы этого избежать, можно передать defaultValue: await firstValueFrom(obs$, { defaultValue: fallback }); await lastValueFrom(obs$, { defaultValue: fallback }); defaultValue сработает только если поток завершился без эмитов. Он не спасёт от ошибок или от вечного ожидания. 2️⃣ lastValueFrom может никогда не разрешиться на бесконечных потоках (например, interval() без ограничения). Поэтому его можно и нужно защищать (take, takeUntil, timeout и т. п.). Примеры: // const observable$ = of(10, 20, 30); const result = await firstValueFrom(observable$); // ограничить количество эмитов const safe$ = source$.pipe(take(5)); const last = await lastValueFrom(safe$); // или добавить таймаут const lastWithTimeout = await lastValueFrom(source$.pipe(timeout({ each: 3000 })), { defaultValue: null }); 🤓 Когда и что выбрать? ⏺️ firstValueFrom — когда нужен первый результат (подходит и для бесконечных потоков); ⏺️ lastValueFrom — только если поток гарантированно конечен или вы явно ограничили его/поставили таймаут. ➡️ Если нужна реактивная обработка нескольких значений — не превращайте Observable в Promise; используйте подписки, async-pipe или RxJS-операторы.
1.2K
просмотров
1825
символов
Да
эмодзи
Нет
медиа

Другие посты @katerina_profrontend

Все посты канала →
firstValueFrom vs lastValueFrom 🤨 В RxJS мы часто работаем — @katerina_profrontend | PostSniper