Порада. Використовуйте лише first()
якщо:
- Ви вважаєте, що нульові елементи, випущені, є умовою помилки (наприклад, заповнення перед надсиланням) І якщо є більше 0% шансу помилки, ви обробляєте це вишукано.
- АБО Ви знаєте на 100%, що спостережуване джерело випромінює 1+ елементів (тому ніколи не можна кидати) .
Якщо є нульові викиди, і ви не впорядковуєте це (з catchError
), то ця помилка поширюватиметься, можливо, спричинить несподівану проблему десь в іншому місці і може бути досить складно виправити, особливо якщо вона надходить від кінцевого користувача.
Ви безпечніше використовувати take(1)
здебільшого за умови, що:
- Ви все гаразд,
take(1)
що нічого не випромінюєте, якщо джерело завершується без емісії.
- Вам не потрібно використовувати вбудований присудок (наприклад,
first(x => x > 10)
)
Примітка: Ви можете використовувати предикат з take(1)
так: .pipe( filter(x => x > 10), take(1) )
. При цьому немає помилок, якщо нічого не буває більше 10.
А як на рахунок single()
Якщо ви хочете бути навіть суворішими та забороняти два викиди, ви можете використовувати single()
помилки, якщо викиди нульові або 2+ . Знову вам доведеться обробляти помилки в такому випадку.
Порада: Single
час від часу може бути корисною, якщо ви хочете, щоб ваша спостережувана ланцюг не займалася додатковою роботою, як зателефонувати в службу http двічі та видавати дві спостережувані дані. Якщо додати single
до кінця труби, ви повідомляєте, чи зробили ви таку помилку. Я використовую його в "запуску завдань", де ви передаєте завдання, яке можна спостерігати, яке повинно випромінювати лише одне значення, тому я передаю відповідь, single(), catchError()
щоб гарантувати гарну поведінку.
Чому б не завжди використовувати first()
замість take(1)
?
ака. Як first
потенційно можуть виникнути більше помилок?
Якщо у вас є спостережуване, яке бере щось із сервісу, а потім передає це через first()
вас, ви повинні будете чудово більшу частину часу. Але якщо хтось придумає відключити послугу з будь-якої причини - і змінить її на випромінювання, of(null)
або NEVER
тоді будь-який first()
оператор нижче починає видавати помилки.
Тепер я розумію, що це може бути саме те , що ви хочете - отже, чому це лише порада. Оператор first
звернувся до мене, бо це звучало трохи менш «незграбно», ніж take(1)
вам, але вам потрібно бути обережними щодо помилок обробки, якщо колись є шанс, що джерело не видаватиметься. Цілком буде залежати від того, чим ти займаєшся.
Якщо у вас є значення за замовчуванням (постійне):
Також врахуйте, .pipe(defaultIfEmpty(42), first())
чи є у вас значення за замовчуванням, яке слід використовувати, якщо нічого не випромінюється. Це, звичайно, не призведе до помилки, оскільки first
завжди отримувало б значення.
Зауважте, що defaultIfEmpty
спрацьовує лише у тому випадку, якщо потік порожній, а не якщо значення випромінюється null
.
first()
іtake()
загалом однаковий, що, на мою думку, очевидно, лише теfirst()
іtake(1)
те саме. Я не впевнений у вашій відповіді, якщо ви вважаєте, що все-таки є різниця?