valor retornar respuesta con javascript node.js gulp

javascript - retornar - ¿Podría Node factible devolver un valor de una llamada de función antes de completar todas las operaciones dentro de la función en sí?



retornar respuesta ajax (1)

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

Esta es una pregunta difícil. La respuesta es no, de modo que devolver un valor significa que la función se terminó de ejecutar, se retiró de la pila 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 podría programar que ocurra algo más 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 llame a x() luego programará otra función para que se ejecute después de 2 segundos, luego imprimirá x2 y luego volverá - en ese punto esta función no podrá hacer nada más para esa invocación.

Significa que x3 nunca se imprimirá, pero x1 finalmente se imprimirá, porque es otra función que se invocará cuando se agote el tiempo de espera. Se llamará a la función anónima no porque la función x() pueda hacer algo después de que vuelva, sino porque logró programar el tiempo de espera antes de que volviera.

Ahora, en lugar de simplemente programar que las cosas sucedan 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 y1 se imprimirá, se devolverá una nueva promesa y y2 nunca se imprimirá porque en ese punto y() volvió y no puede hacer nada más. Pero logró programar un tiempo de espera que resolverá la promesa después de dos segundos.

Puedes observarlo con:

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

Por lo tanto, con este ejemplo puede ver que, aunque la función y() retornado y no pueda hacer otra cosa, se puede llamar a alguna otra función (anónima en este caso) en el futuro y finalizar el trabajo iniciado por la función y() .

Así que espero que ahora esté claro por qué es una pregunta difícil. De alguna manera, una función no puede hacer nada después de regresar. Pero podría haber programado algunas otras funciones como tiempos de espera, manejadores de eventos, etc. que pueden hacer algo después de que las funciones regresen. 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é listo.

Todos los ejemplos podrían simplificarse mediante el uso de las funciones de flecha, pero quería hacer explícito que esas son todas funciones separadas, algunas de ellas tienen nombre, otras son anónimas.

Para más detalles, vea algunas de esas respuestas:

Tengo problemas para entender cómo funciona Node con respecto a su procesamiento paralelo y devolver los valores de las llamadas a funciones.

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

¿Es posible que la función devuelva la secuencia 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 la secuencia) o el Nodo sea lo suficientemente inteligente como para completar todas las declaraciones antes volviendo?

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