Можно ли собирать мусор для подписки на Observable с локальной ссылкой? - PullRequest
0 голосов
/ 13 апреля 2020

Рекомендуется ли подписываться напрямую на Observable, возвращаемый методом?
Будет ли сборка мусора перед вызовом метода обратного вызова?
Например, у меня есть метод в службе:

get<City>(id): Observable<City> {
    var url = this.baseUrl + "api/Cities/" + id;
    return this.http.get<City>(url);
}

Тогда в компоненте у меня есть:

ngOnInit () {
    this.cityService.get<City>(this.id)
            .subscribe(result => {
                 this.city = result;          
            }, 
            error => console.error(error));
}

Метод обратного вызова может быть вызван в любое время, даже через 10 минут, и наблюдаемое уже выходит за рамки.
Так возможно ли, что в плохом сценарии возвращаемый Observable может быть собран мусором до того, как город будет назначен в методе обратного вызова?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Два случая:

  1. Вы работаете с short live Observable, тогда Subscription fini sh вызывают Observable complete(), это теперь можно собирать мусор после выполнения его обратного вызова
  2. Вы работаете с long live Observable, тогда Subscription должен завершить sh вручную subs.unsubscribe() , До тех пор, пока подписка не сохранит ссылку на Observable, поэтому ее нельзя будет собрать перед отпиской. Оба случая в порядке в соответствии с сборкой мусора .
0 голосов
/ 13 апреля 2020

Пока какой-то фрагмент кода может получить доступ к объекту, объект не будет собирать мусор.

Так что да, в зависимости от реализации, Observable может быть выделен c ', хотя какой-то фрагмент кода по-прежнему содержит ссылку на обратный вызов и, следовательно, может вызвать его. Однако, если реализация такова, между наблюдаемым и обратным вызовом нет никакой зависимости, и, следовательно, код будет работать нормально. Так что это не очень плохой сценарий.

Я полагаю, однако, что Observable не только предоставляет метод .subscribe, но и некоторые другие свойства для управления обратными вызовами. В этом случае код, который будет вызывать когда-нибудь, на самом деле содержит ссылку на Observable, которая сама где-то содержит ссылку на обратный вызов. В этом случае обратный вызов будет только g c 'ed, если наблюдаемое получило g c' ed, и это происходит только в том случае, если код больше не содержит ссылку, например, если он прекращает генерировать новые события.

...