¿Podría Node devolver un valor de una llamada de función antes de completar todas las operaciones dentro de la misma función?

Tengo problemas para entender cómo funciona Node en relación con su parallel processing y la devolución de valores de llamadas a funciones.

FYI: La función de truco a continuación se crea simplemente como un ejemplo para esta pregunta.

¿Es posible que la función pueda devolver el flujo antes de que la instrucción Read a large file haya terminado de procesarse (el archivo grande se haya leído completamente del sistema de archivos y se haya agregado el flujo), o es Node lo suficientemente inteligente como para completar todos los estados anteriores? regresando?

 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); } 

One Solution collect form web for “¿Podría Node devolver un valor de una llamada de función antes de completar todas las operaciones dentro de la misma función?”

¿Podría Node devolver un valor de una llamada de función antes de completar todas las operaciones dentro de la misma función?

Esta es una pregunta difícil. La respuesta es no, de manera que devolver un valor significa que la función ha terminado de ejecutarse, se retira de la stack y nunca volverá a hacer nada, a menos que se invoque en otro momento, por supuesto, pero el punto es que esta invocación particular se acabó.

Pero la parte difícil es que es la función que se terminó de ejecutar y no significa que no pueda progtwigr otra cosa para que suceda en el futuro. Se volverá más complicado en un minuto, pero primero un ejemplo muy simple.

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

Aquí, cuando llama a x() entonces progtwigrá otra función para ejecutarse después de 2 segundos, luego imprimirá x2 y luego regresará, momento en el que esta función no puede hacer nada más por esa invocación.

Esto significa que x3 nunca se imprimirá, pero x1 finalmente se imprimirá, porque es otra función que se activará cuando se active el tiempo de espera. Se llamará a la función anónima no porque la función x() pueda hacer nada después de que regrese, sino porque logró progtwigr el tiempo de espera antes de regresar.

Ahora, en lugar de solo progtwigr cosas que sucederán en el futuro, una función puede devolver una promesa que se resolverá algún tiempo después. Por ejemplo:

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

Ahora, cuando corres:

 var promise = y(); 

lo que sucederá es que se imprimirá y1 se devolverá una nueva promesa y nunca se imprimirá y2 porque en ese momento se devolvió y() y no se puede hacer nada más. Pero logró progtwigr un tiempo de espera que resolverá la promesa después de dos segundos.

Se puede observar con:

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

Entonces, con este ejemplo, puede ver que mientras la función y() regresó y no puede hacer nada más, se puede llamar a otra función (anónima en este caso) en el futuro y terminar el trabajo que la función y() ha iniciado.

Así que espero que ahora esté claro por qué es una pregunta difícil. En cierto modo, una función no puede hacer nada después de regresar. Pero podría haber progtwigdo algunas otras funciones como tiempos de espera, controladores de eventos, etc. que pueden hacer algo después de que regresen las funciones. Y si lo que devuelve la función es una promesa, la persona que llama puede observar fácilmente el valor en el futuro cuando esté lista.

Todos los ejemplos podrían simplificarse utilizando las funciones de flecha, pero quería dejar en claro que esas son todas funciones separadas, algunas de ellas tienen nombre, otras son anónimas.

Para más detalles vea algunas de esas respuestas:

  • Una explicación detallada sobre cómo utilizar devoluciones de llamada y promesas
  • Explicación sobre cómo usar promesas en manejadores de solicitudes complejas
  • Una explicación de lo que realmente es una promesa, en el ejemplo de las solicitudes de AJAX
  • Una explicación de las devoluciones de llamada, promesas y cómo acceder a los datos devueltos de forma asíncrona
  • Pruebas de performance en node.js "net"
  • El command Gulp abre gulp.js en el bloc de notas en lugar de ejecutarlo
  • Lienzo de browser cruzado usando nodeJS sin firma encontrada para la function
  • Manejo de errores con Node.js, Async y Formidable
  • La respuesta de Node.js de la request http no llama al evento 'final' sin include el evento 'datos'
  • Cambiar la orientación del papel de Window.print ()
  • Obtenga los datos de neDB de node.js en una variable
  • En Node.js, ¿cómo hago que un server llame a una function en otro server?
  • ¿Es posible usar definiciones de types personalizados en un proyecto ES6?
  • La multiplexación Reveal.js no funciona
  • NodeJs / Bluebird - sigue recibiendo un rechazo no controlado Error
  • requiere () 'ing un file CoffeeScript desde un file JavaScript o REPL
  • Ejemplo de Node.js Express registrar Underscore.js como ver motor?
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.