Про що ви говорите люди !!!
Гаразд, тому є дві причини скасувати підписку на спостереження. Здається, ніхто не дуже багато говорить про дуже важливу другу причину!
1) Очищення ресурсів. Як говорили інші, це є мізерною проблемою для спостереження HTTP. Це просто прибереться.
2) Не допускайте subscribe
запуску обробника.
(Для HTTP це фактично також скасує запит у веб-переглядачі, тому він не витратить часу на читання відповіді. Але це насправді відміна мого основного пункту нижче.)
Релевантність номера 2 залежатиме від того, що робить ваш обробник підписки:
Якщо у вашої subscribe()
функції обробника є будь-який побічний ефект, який небажаний, якщо незалежно від виклику він закритий або розпоряджений, ви повинні скасувати підписку (або додати умовну логіку), щоб запобігти його виконанню.
Розглянемо кілька випадків:
1) Форма входу. Ви вводите ім'я користувача та пароль та натискаєте "Увійти". Що робити, якщо сервер повільний, і ви вирішите натиснути Escape, щоб закрити діалогове вікно? Ви, ймовірно, припустите, що ви не ввійшли в систему, але якщо http-запит повернувся після натискання клавіші escape, ви все одно будете виконувати будь-яку логіку у вас. Це може призвести до перенаправлення на сторінку облікового запису, встановлення небажаного файлу cookie або змінної маркера. Мабуть, це не те, чого очікував ваш користувач.
2) Форма "надіслати електронну пошту".
Якщо subscribe
обробник для "sendEmail" робить щось подібне до запуску анімації "Ваш електронний лист надсилається", перенесіть вас на іншу сторінку або намагається отримати доступ до будь-якого розпорядження, ви можете отримати винятки або небажану поведінку.
Також будьте обережні, щоб не припустити, що unsubscribe()
означає «скасувати». Після того, як повідомлення HTTP перебуває у польоті unsubscribe()
, НЕ скасовує HTTP-запит, якщо воно вже надійшло до вашого сервера. Це лише скасує відповідь, що повернеться до вас. І електронний лист, ймовірно, буде надісланий.
Якщо ви створюєте підписку для надсилання електронної пошти безпосередньо всередині компонента інтерфейсу, ви, ймовірно, хочете скасувати підписку на розпорядження, але якщо електронний лист надсилається централізованою службою, що не користується інтерфейсом, вам, ймовірно, не потрібно.
3) Кутовий компонент, який руйнується / закривається. Будь-які http-спостереження, які все ще запущені в цей час, завершать і запускають свою логіку, якщо ви не скасуєте підписку наonDestroy()
. Будь-які наслідки банальні чи ні, залежатиме від того, що ви робите в обробнику підписки. Якщо ви спробуєте оновити щось, що більше не існує, ви можете отримати помилку.
Іноді у вас можуть бути якісь дії, які ви хотіли б, якщо компонент розміщений, а деякі ви не зробили б. Наприклад, можливо, у вас є звуковий сигнал, що надісланий електронною поштою. Ви, мабуть, хочете, щоб це відтворювалося, навіть якщо компонент був закритий, але якщо ви спробуєте запустити анімацію на компоненті, це не вдасться. У такому випадку рішенням додаткової умовної логіки всередині підписки буде рішення - і ви НЕ хочете скасувати підписку на http-спостережуваний.
Отже, відповідаючи на власне питання, ні, вам цього не потрібно робити, щоб уникнути витоку пам'яті. Але робити це потрібно (часто), щоб уникнути небажаних побічних ефектів, запущених кодом, який може кидати винятки або пошкоджувати стан вашої програми.
Порада: Subscription
містить closed
булева властивість, яка може бути корисною у складних випадках. Для HTTP це буде встановлено після його завершення. У Angular може бути корисно в деяких ситуаціях встановити _isDestroyed
властивість, в ngDestroy
якій може перевірити ваш subscribe
обробник.
Порада 2: Якщо обробляти декілька підписок, ви можете створити спеціальний new Subscription()
об’єкт та add(...)
будь-які інші підписки на нього, тож коли ви скасуєте підписку на основну, він також скасує підписку на всі додані підписки.