Должна ли быть сохранена ссылка на наблюдаемое или только подписка - PullRequest
0 голосов
/ 29 мая 2018

Я недавно сталкивался с этим (угловым) кодом:

ngOnInit() {
  this.subscriptions.add(
    this.createSomeObservable()
      .subscribe(v => console.log('v=', v))
  );
}

Безопасно ли это, или возвращаемые наблюдаемые из this.createSomeObservable() должны быть сохранены как члены класса, чтобы предотвратить сборку мусора?

this.createSomeObservable() на самом деле был выбором из магазина ngrx, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Пока вы не отмените подписку на наблюдаемые, данные не будут собираться мусором.Однако, если речь идет о наблюдаемой HTTP, о которой мы обсуждаем, она отменяется после одного ответа.Так что в этом случае вам, возможно, придется иметь дело со сборкой мусора.В противном случае, пока вы не откажетесь, сборка мусора не должна влиять на вас.Надеюсь, это поможет !!

0 голосов
/ 29 мая 2018

Если angular уничтожает компонент / директиву с помощью ngOnDestroy(), возможны утечки памяти из-за ситуации, когда observable не был отписан.Таким образом, мы должны больше сосредоточиться на правильной подписке и отмене подписки , а не на сохранении наблюдаемых.Это намного лучшее решение.

Вы хотите, чтобы ваш observable был как можно дольше, как я полагаю, поэтому самым простым способом было бы переместить вашу наблюдаемую с помощью subscribe() к какому-то поставщику инъекций service.Вы можете проверить некоторые документы об услугах здесь. К сожалению, он будет жить долго и процветать, пока вы не отмените подписку (не уничтожите ее) - риск утечки памяти все еще возможен.

То, что вы можете сделатьсделать, это правильно отписаться, когда вы закончили с использованием вашего наблюдаемого.Есть несколько возможных решений, но я рекомендую использовать async pipe.Он перемещает проблему unsubscribe в угловую и, как никто другой, знает, когда отписаться.Существуют и другие методы, такие как takeUntil(), но вы можете самостоятельно провести некоторые исследования, например здесь .

Если вы действительно хотите сосредоточиться на значениях, а не на самих наблюдаемых - вы можете просто передать их изродители к ребенку и наоборот. Вот некоторые сведения о взаимодействиях компонентов .

TLDR;Не сохраняйте наблюдаемые - сосредоточьтесь на правильной подписке и отмене подписки на них при необходимости.

РЕДАКТИРОВАТЬ : я неправильно понял вопрос OP - поэтому я дам и пример, как сохранить наши значения от подписки(которые имеют наблюдаемый тип) в компоненте:

@Component({
    selector: 'app-user-settings',
    templateUrl: './user-settings.component.html'
})
export class UserSettingsComponent {

   userSettings$: Observable<UserSettings>;
   permissions$: Observable<UserSettingsPermissions>;

constructor(private store: Store<fromUserSettings.State>) {
    this.UserSettings$ = store.select(fromUserSettings.getUserSettings);
    this.permissions$ = store.select(fromUserSettings.getPermissions);
}

onSaveSettings(formGroup: FormGroup): void {
    this.store.dispatch(new userSettings.PostUserSettings(formGroup));
 }
}

Я назначаю свои наблюдаемые локальным переменным, которые доступны в пакете (чтобы использовать их в HTML).Так что да, если вам нужно использовать их вокруг вашего компонента, вы можете хранить их в некоторых переменных.Таким образом, наблюдаемые из хранилища должны быть доступны, пока компонент не уничтожен.Надеюсь, что это может украсить мой ответ.

PS.Я использую магазин ngrx, поэтому это может быть полезно.

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