Cercando di capire generatori / rendimento node.js – quello che esegue la funzione asincrona?

Node.js ora ha i generatori.

La mia comprensione è che i generatori possono essere utilizzati per scrivere codice che sembra essere molto più lineare e evita di callback inferno e piramide di stile doom codifica.

Quindi, a questo punto, la mia comprensione è che all’interno di un generatore di codice viene eseguito fino a quando non raggiunge una “resa” istruzione. Esecuzione del generatore di funzione sospende, a questo punto. Il yield istruzione specifica un valore di ritorno che può essere una funzione. In genere, si tratta di un blocco di I/O funzione, che normalmente devono essere eseguite in modo asincrono.

La resa di ritorno della funzione è tornato a qualsiasi chiamata generatore.

La mia domanda è, che cosa succede a questo punto? Che cosa esattamente viene eseguito il blocco di I/O funzione che il prodotto restituito?

È corretto che per scrivere generatore/rendimento codice che sembra essere lineare, c’è bisogno di un determinato tipo di funzione che è chiamata a generatore, una funzione che scorre attraverso il generatore ed esegue ogni asincrono ritorno della funzione per la resa, e restituisce il risultato della asincrono funzione il generatore?

Ancora non mi è chiaro esattamente come l’asincrono funzione restituito il rendimento viene eseguito. Se viene eseguita tramite la funzione che chiama il generatore, è eseguita in modo asincrono? Sto cercando di indovinare perché in caso contrario sarebbe risultato il blocco di comportamento.

Per riassumere le mie domande:

  1. Di scrittura “lineare” codice asincrono con i generatori, è necessario che ci sia una funzione di chiamata che scorre il generatore, ceduto l’esecuzione di funzioni di callback e riportando il risultato della richiamata indietro nel generatore?
  2. Se la risposta alla domanda 1 è sì, esattamente come la quantità di funzioni eseguite in modo asincrono?

Qualcuno può dare una migliore panoramica/riassunto di come funziona tutto il processo?

InformationsquelleAutor Duke Dougal | 2013-07-07



3 Replies
  1. 12

    Durante la scrittura di codice asincrono con generatori a che fare con due tipi di funzioni:

    • normale le funzioni dichiarate con function. Queste funzioni non resa. Non è possibile scrivere codice asincrono in sync stile con i loro, perché sono in esecuzione; si può gestire solo completamento asincrono tramite callback (a meno che non si richiama potenza extra come il node-fibers libreria o un codice di trasformazione).
    • generatore le funzioni dichiarate con function*. Queste funzioni può resa. È possibile scrivere codice asincrono in sync stile, dentro di loro, perché essi possono produrre. Ma hai bisogno di un compagno di funzione che crea il generatore, che gestisce le funzioni di callback, e riprende la generatore con un next chiamata ogni volta che una callback incendi.

    Ci sono diverse librerie che implementano compagno funzioni. Nella maggior parte di queste librerie, il compagno funzione gestisce una singola function* alla volta e devi mettere un wrapper per ogni function* nel codice. Il galaxy biblioteca (che ho scritto) è un po ‘ speciale perché è in grado di gestire function* chiamando altri function* senza intermedio wrapper. Il compagno di funzione è un po ‘ difficile, perché si ha a che fare con una pila di generatori.

    Il flusso di esecuzione può essere di difficile comprensione a causa del poco yield/next danza tra il function* e il compagno di funzione. Un modo per comprendere il flusso è quello di scrivere un esempio con la biblioteca di vostra scelta, aggiungere console.log dichiarazioni sia nel codice e in biblioteca, e l’esecuzione.

  2. 4

    Se [il blocco di funzioni i /o] viene eseguita la funzione che chiama
    il generatore, è eseguita in modo asincrono? Sto cercando di indovinare perché
    fare altrimenti sarebbe risultato il blocco di comportamento.

    Non credo generatori di fare attività asincrona gestione. Con i generatori, solo una cosa è in esecuzione allo stesso tempo-è solo che una funzione può interrompere l’esecuzione e passare il controllo ad un’altra funzione. Per esempio,

    function iofunc1() {
      console.log('iofunc1');
    }
    
    function iofunc2() {
      console.log('iofunc2');
    }
    
    function* do_stuff() {
      yield iofunc1;
      yield iofunc2;
      console.log('goodbye');
    }
    
    
    var gen = do_stuff();
    (gen.next().value)(); 
    (gen.next().value)(); //This line won't begin execution until the function call on the previous line returns
    gen.next(); //continue executing do_stuff

    Se hai letto alcuni articoli su nodejs generatori:

    1. http://jlongster.com/2012/10/05/javascript-yield.html
    2. http://jlongster.com/A-Study-on-Solving-Callbacks-with-JavaScript-Generators
    3. http://jlongster.com/A-Closer-Look-at-Generators-Without-Promises

    …tutti si utilizzano ulteriori funzioni/librerie per aggiungere in esecuzione asincrona.

  3. 2

    1: scrivere “lineare” codice asincrono con i generatori, è necessario che
    che ci sia una funzione di chiamata che scorre il generatore,
    l’esecuzione ha reso le funzioni di callback e restituendo il risultato di
    la richiamata indietro nel generatore?

    Sì. Chiamiamola “launcher”.

    2: se la risposta alla domanda 1 è sì, esattamente come il fruttato
    funzioni eseguite in modo asincrono?

    All’interno del generatore, si cede un array con: la funzione e i suoi parametri. Il controllo del chiamante (lanciatore), è possibile utilizzare il tasto fn.applicare(..,callback) per chiamata asincrona, mettere la chiamata a “generatore.successivo(dati);” (riprendi) all’interno di callback.

    async funzione viene eseguita in modo asincrono, ma il generatore sarà “sospeso” al punto di snervamento, fino a quando la callback viene chiamata (e quindi “generatore.successivo(dati)” viene eseguito)

    Lavoro pieno di lib e campioni:
    https://github.com/luciotato/waitfor-es6

Lascia un commento