Как отписаться от слушателя в реальном времени Firestore, который обернут в наблюдаемую rxjs? - PullRequest
0 голосов
/ 17 октября 2018

Я написал функцию, которая возвращает наблюдаемое, обертывающее метод firestore onSnapshot.

function getObservable() {
  return Observable.create(observer => {
      firebase.firestore().collection('users').onSnapshot(
        snapshot => observer.next(snapshot.docs),
      );
    });
  })
}

Я могу использовать эту функцию и получить обновленные документы следующим образом

const observable = getObservable()
const subscription = observable.subscribe(users => console.log('users'));

Если я сейчас вызову метод subscription.unsubscribe(), я откажусь от подписки.Однако я не буду подписываться на прослушиватель onSnapshot.

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

1 Ответ

0 голосов
/ 17 октября 2018

Из документации RxJS (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-create):

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

Итак, если я понял это право,Вы можете попробовать что-то похожее на это

function getObservable() {
  return Observable.create(observer => {
      const unsubscribe = firebase.firestore().collection('users').onSnapshot(
        snapshot => observer.next(snapshot.docs),
      );
      return unsubscribe;
    });
  })
}
...