2016-02-10 14 views
7

Oglądam tutorial Redbe Dana Abramova o Egghead, a on robi coś, co mnie trochę pomieszało. Jako ćwiczenie do nauki ma on przeglądać odbudowę createStore. Jedną z metod jest createStore, która dodaje detektory do nasłuchiwania zmian w sklepie.ES6/Redux: zwracanie funkcji usuwania detektora zdarzeń

Potem mówi:

Jest to ważny kawałek brakuje tutaj. Nie udostępniliśmy sposobu na anulowanie subskrypcji. Zamiast dodawać dedykowaną metodę Unsubscribe, zwrócimy tylko funkcję z metody Subscribe, która usuwa ten obiekt nasłuchujący z tablicy detektorów.

Więc kod używa do dodawania/usuwania słuchacza jest:

const subscribe = (listener) => { 
    listeners.push(listener); 
    return() => { 
    listeners = listeners.filter(l => l !== listener); 
    }; 
}; 

I rodzaju zrozumieć, że ta pozwala na użycie jedną funkcję zarówno dodaj/usuń, a że jest to możliwe, ponieważ jeśli przekażesz metodę subskrybowania nazwę odbiornika, który jest już subskrybowany, filtr usunie go, rozumiem, dlaczego to zwraca funkcję strzałki, a nie tablicę detektorów. W jaki sposób/kiedy funkcja ta mogłaby zostać wywołana?

Odpowiedz

7

Jak/w jaki sposób powrócić tę funkcję?

Ta funkcja jest wywoływana, gdy detektor powinien zostać usunięty. Kiedy dokładnie to się stanie, zależy od aplikacji.

Inwokacja jest prosta:

const remove = subscribe(myListener); 
// later: 
remove(); 

Nie rozumiem dlaczego ten zwraca funkcję strzałki zamiast tablicę słuchaczy.

Pozwoliłoby to dowolnemu subskrybentowi zadzwonić z tablicą słuchaczy lub wymaga, aby każdy subskrybent wdrożył tę samą logikę wypisania.

+0

Chciałem tylko dodać, że jest to bardzo powszechne podejście. Na przykład spójrz, jak działa funkcja AngularJS [$ scope. $ On()] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope). Zwraca funkcję wyrejestrowania dla detektora. – Warlock

+0

Dziękuję, to jest dobre wytłumaczenie i całkiem fajny wzór, którego wcześniej nie widziałem/nie zauważyłem! – HowlingFantods

+0

Ale dlaczego nie zdefiniować funkcji wypisania się, a komponent implementujący detektor może wywołać store.unsubscribe (listener). Czy to dlatego, że oddziela komponent od sklepu? – sabman

Powiązane problemy