2016-02-10 11 views
7

Sto osservando il tutorial di Dan Abramov su Redwood su Egghead, e lui fa qualcosa di cui sono un po 'confuso. Come esercizio di apprendimento, gli spettatori hanno ricostruito l'astrazione createStore. Un metodo createStore fornisce è subscribe, che consente ai listener di ascoltare le modifiche degli archivi.ES6/Redux: restituisce una funzione per rimuovere l'ascoltatore di eventi

Poi dice:

C'è un importante pezzo mancante qui. Non abbiamo fornito un modo per annullare l'iscrizione a un ascoltatore. Anziché aggiungere un metodo di annullamento sottoscrizione dedicato, verrà semplicemente restituita una funzione dal metodo Sottoscrivi che rimuove questo listener dall'array degli ascoltatori.

Così il codice che usa per aggiungere/rimuovere l'ascoltatore è:

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

I sorta di capire che questo consente di utilizzare una funzione sia per aggiungere/rimuovere, e che questo è possibile perché se si passa al metodo subscribe il nome di un listener già sottoscritto, il filtro lo rimuoverà, lo faccio non per capire perché questo restituisce una funzione di freccia piuttosto che un array di listener. Come/quando verrebbe invocata questa funzione restituita?

risposta

7

Come/quando verrebbe richiamata questa funzione restituita?

Questa funzione viene richiamata quando il listener deve essere rimosso. Quando esattamente ciò dovrebbe accadere dipende dall'app.

Invocazione è semplice:

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

Non capisco perché questo restituisce una funzione freccia piuttosto che una serie di ascoltatori.

Ciò consentirebbe a qualsiasi abbonato di pasticciare con l'array di ascoltatori, o impone a ciascun abbonato di implementare la stessa logica di annullamento dell'iscrizione.

+0

Volevo solo aggiungere che questo è un approccio molto comune. Ad esempio, dai un'occhiata a come funziona la funzione AngularJS [$ scope. $ On()] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope). Restituisce una funzione di deregistrazione per un ascoltatore. – Warlock

+0

Grazie, questa è una buona spiegazione e uno schema piuttosto interessante che non avevo mai visto/notato prima! – HowlingFantods

+0

Ma perché non definire una funzione di annullamento dell'iscrizione e il componente che implementa il listener può chiamare store.unsubscribe (listener). È perché disaccoppia il componente dal negozio? – sabman

Problemi correlati