отказаться от подписки на оператор Rx js finalize - PullRequest
0 голосов
/ 17 июня 2020

Q: У меня вопрос. Оператор finalize был вызван, когда источник завершил или завершил Observable. Это ясно. Но как мы можем предсказать, не будет ли он снова выдавать значение из-за изменения наблюдаемого источника? Или finalize завершит исходный наблюдаемый объект после завершения его первого выброса. т.е. больше не будет излучений из источника, например take(1).

Я использую модуль AngularFireStorage для загрузки URL. Мне нужно завершить наблюдаемое после того, как он вернул URL-адрес. Как я могу это сделать? т.е. без отказа от подписки здесь.

Будет так работать или лучше? Как я могу автоматически отказаться от подписки после получения URL-адреса загрузки?

     afUploadTask.snapshotChanges().pipe(take(1), finalize(() => this.downloadURL 
= afStorageReference.getDownloadURL())).subscribe();

Это оригинальный пример из do c:

task.snapshotChanges().pipe(
        finalize(() => this.downloadURL = fileRef.getDownloadURL() )
     )
    .subscribe()

1 Ответ

1 голос
/ 17 июня 2020

Ваша цель - дождаться завершения задачи загрузки и затем установить URL-адрес. вы можете сделать точно так же, как в примере, или примерно так:

afUploadTask.snapshotChanges().subscribe(
  null,
  null,
  () => this.downloadURL = afStorageReference.getDownloadURL()
);

это также будет эквивалентно:

afUploadTask.snapshotChanges().pipe(last()).subscribe(
  () => this.downloadURL = afStorageReference.getDownloadURL()
);

добавление оператора take вызовет преждевременное завершение перед URL доступен. Вам не нужно беспокоиться об отказе от подписки, поскольку наблюдаемое завершится, когда загрузка завершится. Завершенный наблюдаемый объект не предотвратит сборку мусора и не вызовет утечки памяти.

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