почему clearInterval используется, когда мы используем setInterval в наблюдаемых - PullRequest
0 голосов
/ 13 мая 2019

почему нам нужно возвращать функцию с clearInterval, когда мы уже отменили подписку наблюдаемого (имея setInterval). Даже если я не возвращаю функцию clearInterval, она дает тот же результат. https://www.learnrxjs.io/operators/creation/create.html

Я попытался удалить строку возврата, и это дало тот же результат

const evenNumbers = Observable.create(function(observer) {
    let value = 0;
    const interval = setInterval(() => {
        if (value % 2 === 0) {
            observer.next(value);
        }
    value++;
    }, 1000);

    return () => clearInterval(interval);  ---> why is it necessary
});
const subscribe = evenNumbers.subscribe(val => console.log(val));
setTimeout(() => {
    subscribe.unsubscribe();
}, 10000);

в каждом случае, результат 0 2 4 6 8

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Как и в официальных документах для create, связанных в нижней части страницы LearnRxJs, на которую вы ссылались:

onSubscription может дополнительно возвращать либо функцию, либо объект с unsubscribe метод.В обоих случаях функция или метод будут вызываться при отмене подписки на Observable и должны использоваться для очистки всех ресурсов.Так, например, если вы используете setTimeout в своем настраиваемом Observable, когда кто-то отписывается, вы можете очистить запланированный тайм-аут, чтобы он не срабатывал без необходимости, и браузер (или другая среда) не тратит вычислительную мощность на событие синхронизации, котороеникто не будет слушать в любом случае.

Он также определяет функцию подписки следующим образом (выделение мое):

Функция, которая принимает наблюдателя и вызывает его *Методы 1015 *, error и complete, в зависимости от ситуации, и , опционально, возвращает некоторую логику для очистки ресурсов .

Цель здесь - предоставить RxJ достаточно информации длязнать, как очистить ресурсы, когда он знает, что они больше не будут вызываться.Здесь, в случаях, когда RxJs знает, что интервальный таймер не имеет значения, он может очистить таймер.Вы правы, что это не оказывает немедленного влияния на правильность - ваша функция будет возвращать то же самое в любом случае - но она дает вам возможность хорошо использовать память и сохранять очистку автономной.

0 голосов
/ 13 мая 2019

При setInterval обратный вызов будет повторяться до тех пор, пока не будет вызван clearInterval, чтобы остановить повтор. Это часть стандартного JavaScript и обрабатывается отдельно от другого кода, такого как созданные вами объекты Observable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...