Generatori: elementi nocivi

La specifica bozza di ECMAScript 6 ha già dato grande gioia ai moderni sviluppatori JavaScript. In un post precedente abbiamo trattato alcune nuove classi di raccolte e for..of loop di iterazione. In questo post, parleremo di qualcosa che va di pari passo con i loop for..of: le funzioni del generatore.

Esiste già una serie di ottimo materiale che spiega perché e come usare i generatori. In breve, i generatori sono funzioni speciali che creano iteratori, mentre gli iteratori sono oggetti che hanno un metodo next(), che può essere chiamato per ottenere un valore. All'interno di una funzione generatore, la parola chiave yield fornisce il valore per next(). L'uso di yield sospende l'esecuzione della funzione del generatore, conservando lo stato fino a quando non viene richiamato next(). A quel punto il codice si riavvia e continua finché non viene restituito yield un altro valore (o fino al termine della funzione del generatore). Esistono diversi casi d'uso canonici per le funzioni dei generatori, ad esempio il loro utilizzo per eseguire l'iterazione sui numeri della sequenza di Fibonacci.

Mettete in evidenza le nozioni di base, approfondiamo un esempio di JavaScript che illustra alcuni passaggi, o "partite nodose", dell'utilizzo dei generatori. I commenti sono molto numerosi e puoi sperimentare la versione live del codice prima di leggerla:

Quali sono alcuni importanti concetti del codice?

Per prima cosa, la creazione di un generatore genera un iteratore unico con il suo stato distinto e puoi passare dei parametri al costruttore del generatore, che può controllare il comportamento.

In secondo luogo, puoi passare un parametro quando chiami il metodo next() di un iteratore, e quel valore verrà assegnato a ciò che si trova sul lato sinistro dell'istruzione yield nella chiamata precedente dell'iteratore. Questo è un ottimo modo per variare l'output dell'iteratore: in questo caso lo utilizziamo per controllare se la parola prodotta è in maiuscolo o no. Se vuoi influenzare il primo valore ottenuto, usa un parametro nel costruttore del generatore.

Infine, i generatori possono produrre iteratori finiti o infiniti. Se stai lavorando con un iteratore infinito, assicurati di avere una sorta di condizione terminale basata sul valore yielded: è molto facile scrivere loop infiniti, soprattutto quando si utilizza for..of per l'iterazione. Se stai lavorando con un iteratore finito tramite chiamate a next(), la proprietà .done dell'oggetto che ha restituito indica se l'iterazione è stata completata.

Ci auguriamo che questo esempio, insieme alle altre risorse disponibili sul web, ti dia entusiasmo e ti aiuti a pensare a come puoi utilizzare i generatori nel tuo codice. Le versioni di Firefox a partire dalla 31 e Chrome con la versione 39 supportano i generatori in modo nativo. Il progetto Regenerator offre il supporto generatore per altri browser ed è possibile utilizzare anche Traceur.

Grazie a Erik Arvidsson per il suo aiuto nel leggere questo articolo.