una - somma elementi array javascript



Potrebbe Nodo restituire facilmente un valore da una chiamata di funzione prima di completare tutte le operazioni all'interno della funzione stessa? (1)

Ho difficoltà a capire come funziona Node per quanto riguarda l'elaborazione parallela e la restituzione dei valori dalle chiamate di funzione.

A proposito: la funzione di Gulp qui sotto è semplicemente creato come esempio per questa domanda.

È possibile che la funzione possa restituire lo stream prima che l'istruzione Read a large file abbia terminato l'elaborazione (il file di grandi dimensioni è stato letto completamente dal file system e lo stream è stato aggiunto), oppure il Nodo è abbastanza intelligente da completare tutte le istruzioni prima ritorno?

function moveFiles(){

    var gulp = require('gulp'),
        stream = require('merge-stream')();

    // Read a large file
    stream.add(gulp.src('src/large-file.txt')
        .pipe(gulp.dest('dest/'))
    );

    // Read a small file
    stream.add(gulp.src('src/small-file.txt')
        .pipe(gulp.dest('dest/'))
    );

    return (stream.isEmpty() ? null : stream);

}

Potrebbe Nodo restituire facilmente un valore da una chiamata di funzione prima di completare tutte le operazioni all'interno della funzione stessa?

Questa è una domanda complicata. La risposta è no, in un modo in cui restituire un valore significa che la funzione è finita, è stata rimossa dallo stack e non farà mai più nulla, a meno che non sia invocato in un altro momento, ma il punto è che questa particolare invocazione è finita.

Ma la parte più difficile è che è la funzione che ha terminato l'esecuzione e ciò non significa che non possa programmare qualcos'altro in futuro. Sarà più complicato in un minuto, ma prima un esempio molto semplice.

function x() {
    setTimeout(function () {
        console.log('x1'));
    }, 2000);
    console.log('x2');
    return;
    console.log('x3');
}

Qui quando chiamate x() allora programmerà un'altra funzione che verrà eseguita dopo 2 secondi, quindi stamperà x2 e poi ritornerà - a quel punto questa funzione non può fare altro per quell'invocazione.

Significa che x3 non verrà mai stampato, ma x1 verrà stampato, perché è un'altra funzione che verrà chiamata quando scatta il timeout. La funzione anonima verrà chiamata non perché la funzione x() può fare qualcosa dopo che è ritornata, ma perché è riuscita a programmare il timeout prima che ritornasse.

Ora, invece di pianificare semplicemente le cose che accadranno in futuro, una funzione può restituire una promessa che verrà risolta qualche tempo dopo. Per esempio:

function y() {
    console.log('y1');
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve('message from y()');
        }, 2000);
    });
    console.log('y2');
}

Ora, quando corri:

var promise = y();

ciò che accadrà è che y1 verrà stampato, una nuova promessa verrà restituita e y2 non verrà mai stampato perché a quel punto y() restituito e non può fare altro. Ma è riuscito a programmare un timeout che risolverà la promessa dopo due secondi.

Puoi osservarlo con:

promise.then(function (value) {
    console.log(value);
});

Quindi con questo esempio puoi vedere che mentre la funzione y() è ritornata e non può fare nient'altro, un'altra funzione (anonima in questo caso) può essere chiamata in futuro e terminare il lavoro avviato dalla funzione y() .

Quindi spero che ora sia chiaro perché è una domanda complicata. In un certo senso una funzione non può fare nulla dopo il ritorno. Ma potrebbe aver programmato alcune altre funzioni come timeout, gestori di eventi, ecc. Che possono fare qualcosa dopo il ritorno delle funzioni. E se la cosa che la funzione restituisce è una promessa, allora il chiamante può facilmente osservare il valore in futuro quando è pronto.

Tutti gli esempi potrebbero essere semplificati utilizzando le funzioni di freccia, ma volevo rendere esplicito che quelle sono tutte funzioni separate, alcune di esse hanno un nome, altre sono anonime.

Per maggiori dettagli vedi alcune di quelle risposte:





gulp