Como faço para substituir um assinante com um Observer?

votos
0

Esta questão no GitHub praticamente resume tudo. I 'am usando um timer()com uma programação periódica de 1 segundo para realizar uma determinada tarefa. I emparelhá-lo com um Subscriberpara inscrever-se os intervalos. Quando um determinado modelo é executado fora de dados, eu Baixa-lo e esperar por novas chegadas. Quando dados são preenchidos novamente, vou tentar inscrever novamente, mas ele não funciona. Acontece whena Subscriberfoi unsub'd, eu não posso usá-lo novamente. Então eu devo substituí-lo com um Observer. Um novato aqui, eu não tenho nenhuma idéia de como fazer isso. tentei olhar para exemplos, eles só me confundiu ainda mais.

Como faço para substituir o seguinte código para funcionar com uma Observervez?

private timer = timer(1000, 1000);

// A timer subscription that keeps sending new images to the observer
timerSubscription = new Subscriber(() => {

    // Check if there is an element in the list
    if (this.head != null) {

      // If the current node at head is a folder, unsubscribe the listener
      if (this.head.data['id'].startsWith('folder')) {
        this.timerSubscription.unsubscribe();
      }

      // Pop a node from the list and pass on to observer
      this.observer.next(this.this$PiFrame.pop());

    } else {

      // If no nodes are left, unsubscribe from the timer
      this.timerSubscription.unsubscribe();

      console.log('No items left on the queue. Deactivating timer subscription.');
    }
  }, e => {}, () => {});

e eu subscrevo assim:

    ...
    // Setup a timer to pop every 1000 ms
    this.timer.subscribe(this.this$PiFrame.timerSubscription);
    ...
    // If no nodes are left, unsubscribe from the timer
    this.timerSubscription.unsubscribe();
    ...
Publicado 02/09/2018 em 05:37
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Em vez de criar a subscrição a maneira de fazer, deixe o Observableretorno da assinatura.

Mantenha a sua lógica em uma função, assim:

  doWhatever() {
    console.log("tick")

    // Check if there is an element in the list
    if (this.head != null) {

      // If the current node at head is a folder, unsubscribe the listener
      if (this.head.data['id'].startsWith('folder')) {
        this.timerSubscription.unsubscribe();
      }

      // Pop a node from the list and pass on to observer
      this.observer.next(this.this$PiFrame.pop());

    } else {

      // If no nodes are left, unsubscribe from the timer
      this.timerSubscription.unsubscribe();

      console.log('No items left on the queue. Deactivating timer subscription.');
    }
  }

Então, quando você deseja se inscrever:

this.timerSubscription = this.timer.subscribe(() => this.doWhatever());

Isto pode ser usado repetidamente, à medida que cada subscribegera um novoSubscription

Respondeu 02/09/2018 em 06:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more