sincrono promesas node ejecucion controlar codigo async asincrono asincronia asincrona anidadas javascript node.js asynchronous

javascript - promesas - Comprender el código asíncrono en términos de Layman



js promesas anidadas (3)

Tiene varias preguntas no relacionadas aquí:

1) El poder de la sincronización es poder hacer varias cosas al mismo tiempo sin bloquear el hilo principal. En nodo y js en general, esto se aplica particularmente a las solicitudes de archivo ajax. Esto significa que puedo activar varias llamadas asincrónicas para recuperar archivos y no bloquear el hilo principal mientras se procesa el contenido. Mi marco preferido es jQuery, que tiene $ .Deferred convenientes que envuelve y estandariza las llamadas asincrónicas para el uso de jQuery.

2) la respuesta y los datos posteriores provienen del método principal. No hay nada mágico aquí, es una llamada a función normal, por lo que los valores de estos se crean en otro lugar y pasan a esta invocación. Según la estructura de nodos que tenga, la firma exacta de su método cambiará.

3) Puede definir una variable global en su devolución de llamada si tiene un alcance adecuado. Sin embargo, parece que necesitas ayuda para saber qué alcance tiene. Aquí hay algunos enlaces

http://www.digital-web.com/articles/scope_in_javascript/

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

4) Una vez que se sincroniza, nunca se puede retroceder, sin embargo, aprovechando los objetos prometedores y diferidos, como con jQuery Diferidos, puede esperar que se completen varios asyncs antes de continuar su ejecución en otro asincrónico. Deferreds son tus amigos.

http://api.jquery.com/category/deferred-object/

Entiendo lo básico acerca de la asincronía-ness: las cosas no se ejecutan secuencialmente. Y entiendo que hay algo muy poderoso sobre eso ... supuestamente. Pero por mi vida no puedo entender el código. Echemos un vistazo al código Async Node.JS que HE ESCRITO ... pero que realmente no entiendo.

function newuser(response, postData) { console.log("Request handler ''newuser'' was called."); var body = ''<html>'' + ''<head>'' + ''<meta http-equiv="Content-Type" content="text/html; '' + ''charset=UTF-8" />'' + ''</head>'' + ''<body>'' + ''<form action=" /thanks" method="post">'' + ''<h1> First Name </h1>'' + ''<textarea name="text" rows="1" cols="20"></textarea>'' + ''<h1> Last Name </h1>'' + ''<textarea name="text" rows="1" cols="20"></textarea>'' + ''<h1> Email </h1>'' + ''<textarea name="text" rows="1" cols="20"></textarea>'' + ''<input type="submit" value="Submit text" />'' + ''</body>'' + ''</html>''; response.writeHead(200, { "Content-Type": "text/html" }); response.write(body); response.end(); }

¿De dónde vino la respuesta? ¿PostData? ¿Por qué no puedo definir una variable en esta "devolución de llamada" y luego usarla fuera de la devolución de llamada? ¿Hay alguna manera de que algunas cosas sean secuenciales y el resto del programa asincrónico?


No estoy seguro de dónde se está utilizando esta función, pero el punto de devolución de llamada es que los pasa a una función que se ejecuta de forma asíncrona; almacena su devolución de llamada, y cuando esa función se hace con lo que sea necesario, llamará a su devolución de llamada con los parámetros necesarios. Un ejemplo de adelante hacia atrás es probablemente el mejor.

Imagine que tenemos un marco, y en él hay una operación que se ejecuta durante mucho tiempo, obteniendo algunos datos de la base de datos.

function getStuffFromDatabase() { // this takes a long time };

Como no queremos que se ejecute sincrónicamente, permitiremos que el usuario pase una devolución de llamada.

function getStuffFromDatabase(callback) { // this takes a long time };

setTimeout tomar mucho tiempo con una llamada a setTimeout ; también pretendemos que obtuvimos algunos datos de la base de datos, pero solo codificaremos un valor de cadena.

function getStuffFromDatabase(callback) { setTimeout(function() { var results = "database data"; }, 5000); };

Finalmente, una vez que tengamos los datos, llamaremos a la devolución de llamada que nos dio el usuario de la función del marco.

function getStuffFromDatabase(callback) { setTimeout(function() { var results = "database data"; callback(results); }, 5000); };

Como usuario del marco, haría algo como esto para usar la función:

getStuffFromDatabase(function(data) { console.log("The database data is " + data); });

Entonces, como puede ver, los data (lo mismo que la response y los datos postData a su ejemplo) provienen de la función a la que le postData la devolución de llamada; le proporciona esos datos cuando sabe cuáles deberían ser esos datos.

La razón por la que no puede establecer un valor en su devolución de llamada y usarla fuera de la devolución de llamada es porque la devolución de llamada en sí no ocurre hasta más adelante en el tiempo.

// executed immediately executed sometime in the future // | | by getStuffFromDatabase // v v getStuffFromDatabase(function(data) { var results = data; // <- this isn''t available until sometime in the future! }); console.log(results); // <- executed immediately

Cuando se ejecuta console.log , ¡la asignación de los var results todavía no ha sucedido!


Parece que estás trabajando en el Node Beginner Book . Te animo a que estudies todo el libro, realmente es una excelente introducción. Si intenta comprender mejor el Javascript, los videos de Douglas Crockford en YouTube son una excelente descripción general: 1 , 2 .

La pieza de código que has publicado no tiene suficiente contexto para que realmente te ayude. response es un parámetro que está pasando a su función, no proviene de postData. Si está trabajando con código de la manera en que lo sugiere el Node Beginner Book, probablemente esté transmitiendo una respuesta a su función newuser desde la función createServer, que es parte del módulo http que viene con Node.

No puede definir una variable en la devolución de llamada y luego usarla en la devolución de llamada porque Javascript tiene un alcance léxico. Aquí hay una publicación de sobre el tema del alcance de Javascript. El primer video de Doug Crockford que publiqué también tiene una gran explicación de las reglas de alcance de Javascript.

Javascript no es necesariamente asincrónico Simplemente proporciona funciones anónimas que son cierres, que son una herramienta útil para implementar fácilmente la lógica asíncrona. De nuevo, el Node Beginner Book muestra un buen ejemplo de cómo escribir código sincrónico con Node (no es lo que desea), y luego lo reescribe para hacerlo asincrónico.