Ostatnio czytałem o RXJS. Ten kod jest z Doc.

import { Observable } from 'rxjs';
 
const observable = new Observable(subscriber => {
  setTimeout(() => {
    subscriber.complete();
    subscriber.next(1);
  }, 1000);
});
 
observable.subscribe({
  next(x) { console.log('got value ' + x); },
  error(err) { console.error('something wrong occurred: ' + err); },
  complete() { console.log('done'); }
});
console.log('just after subscribe');

Jak powiedział, że jeśli zostanie dostarczony błąd lub pełne powiadomienie, nic innego nie może być dostarczane później. Jak można to zrobić pod maską z czystym JS? Czy istnieje sposób na zmianę funkcji Subskrybuj i dynamicznie powrót, gdy wykonana jest metoda kompletna / błędu?

1
vutien 17 październik 2020, 12:10

1 odpowiedź

Najlepsza odpowiedź

Sposób, w jaki prace RXJS jest bardzo interesujące. Udostępniałem moją perspektywę na nim w tym Więc odpowiedz. Próbowałem zakryć, jak Observable.subscribe, Observable.subscribe i jak Subject.observers działa pod maską.

Ale gist byłby to (ponownie, to jest moja perspektywa po wydaniu czasu czytania kodu źródłowego):

RXJS osiąga swoje funkcje przez Linked Lists .

Zasadniczo istnieją 2 połączone listy. Jeden jest tworzony za pomocą Observable.pipe(), którego węzły są zdefiniowane przez operatorów (np. {X1}}, take, map), a druga jest tworzona na {{x4 }}. To jest lista subscribers.

Operator jest Towarzyszy wraz z instancją Subscriber. Na przykład operator map ma MapSubscriber. Abonenci operatorów nazywali się dokładnie takimi jak RXJS 7, teraz używa bardzo inteligentnego sposobu na Logika, która definiuje operatora.

Jak można to zrobić pod maską z czystym JS

Jak wspomniano wcześniej, każdy {X0}} ma metody next(), error() complete(). Na przykład dzieje się tak, co dzieje się na {{{ X4}}:

error(err?: any): void {
  if (!this.isStopped) {
    this.isStopped = true;
    this._error(err);
  }
}

{{X0}. Powiadomienia X1}} można przekazać:

next(value?: T): void {
  if (!this.isStopped) {
    this._next(value!);
  }
}

Oczywiście, nie jest to jedyna rzecz, która dzieje się, gdy występuje wydarzenie error, RXJS również dba o zrywaną logikę, zwalniając zasoby.

0
Andrei Gătej 17 październik 2020, 11:10