Порада. Використовуйте лише 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)те саме. Я не впевнений у вашій відповіді, якщо ви вважаєте, що все-таки є різниця?