tutorial que principiantes para pagina node libro funcion ejecutar despues desde cero cargar carga asincrona antes javascript node.js asynchronous synchronous

que - ¿Son todas las devoluciones de llamada de javascript asíncronas? Si no, ¿cómo sé cuáles son?



node js desde cero pdf (4)

Simplemente tomar una devolución de llamada no hace que una función sea asíncrona. Hay muchos ejemplos de funciones que toman un argumento de función pero no son asincrónicas, por ejemplo, Array ''s para cada forEach .

Para que una función sea asíncrona, debe realizar una operación asíncrona. Las formas de introducir asincronicidad pueden ser

  • funciones de temporizador setTimeout , setInterval
  • funciones especiales nextTick , setImmediate
  • I / O (escuchar la red, consultar una base de datos, leer o escribir desde un recurso)
  • suscribirse a un evento

Según el artículo "¿Hacer una devolución de llamada hace que una función sea asíncrona?"

Tengo curiosidad sobre si todas las devoluciones de llamada de javascript son asincrónicas, o si ese es el caso solo en ciertas situaciones. Además, estoy seguro de que lo que hace que el código javascript sea asíncrono (o formas de usar javascript asíncrono) difiere entre el navegador y nodejs, por lo que me gustaría saber en cada situación qué constituye javascript asíncrono real.

Tengo la impresión de que en el siguiente escenario, en realidad no estoy escribiendo un código asíncrono.

function addOne(value){ value = value + 1; return value; } function simpleMap(values, callback){ for(i = 0; i < values.length; i++){ val = values[i]; val = callback(val); values[i] = val; } return values; } newValues = simpleMap([1,2,3], addOne);

Sin embargo, por ejemplo, sé que las funciones AJAX de jQuery son verdaderamente asincrónicas (sin tomar en cuenta las promesas que ahora están disponibles). ¿Qué es lo que hace que el AJAX de jQuery sea asíncrono? ¿Es tan simple que involucra solicitudes XHR, y en el navegador, todas las solicitudes XHR son asincrónicas?

Tengo la misma pregunta para el entorno nodejs. ¿Puede algo en el nodo ser asíncrono solo si involucra algo como el archivo i / o, process.nextTick, setTimeout o setInterval? ¿Por qué cuando hago algo como una llamada a la base de datos con mongodb / mongoose, es eso asíncrono? ¿Qué está sucediendo detrás de las escenas que lo está haciendo así?

¿Están las "situaciones" asincrónicas predeterminadas por el entorno? ¿O hay alguna manera de hacer que la propia función sea realmente asíncrona sin aprovechar funciones muy específicas del entorno (como xhr, file io en node, process.nexttick, etc.)?


Tengo curiosidad sobre si todas las devoluciones de llamada de javascript son asíncronas

No. Por ejemplo, la devolución de llamada utilizada por Array#sort no es asincrónica, ni tampoco la utilizada por String#replace .

La única manera de saber si una devolución de llamada es asincrónica proviene de su documentación. Por lo general, aquellos que involucran solicitudes de recursos externos (llamadas ajax, por ejemplo) son asincrónicos, y otros pueden ser o no ser.

Sin embargo, por ejemplo, sé que las funciones AJAX de jQuery son verdaderamente asincrónicas ...

No necesariamente, ya que actualmente jQuery aún tiene el indicador async que puede establecer como false para forzar una solicitud síncrona. (No es una buena idea, y van a eliminar eso, pero usted puede . JQuery pasa la bandera al objeto del navegador subyacente que proporciona el comportamiento sincrónico / asincrónico).

¿Qué es lo que hace que el AJAX de jQuery sea asíncrono?

El navegador. Las llamadas ajax de jQuery usan el objeto XMLHttpRequest (o en ciertas situaciones, un elemento de script ), que por defecto es una operación asincrónica proporcionada por el navegador.

¿O hay alguna manera de hacer que la propia función sea verdaderamente asincrónica sin aprovechar funciones muy específicas del entorno ...

Hasta hace poco, no. Hasta la especificación de la quinta edición, JavaScript, el lenguaje era básicamente silencioso sobre todo el concepto de subprocesos y asincronicidad; solo cuando llegaste a los entornos surgió. La única forma de hacer algo asíncrono era usar una función proporcionada por el host, como nextTick (o cualquiera de las diversas operaciones que se completa de forma asíncrona) en NodeJS o setTimeout en los navegadores.

En la especificación ECMAScript 6ª edición en junio de 2015, introdujeron promesas en el lenguaje. Las retrollamadas conectadas a una promesa de ES6 en then y siempre se invocan de forma asíncrona (incluso si la promesa ya está resuelta cuando se conecta la devolución de llamada), y ahora JavaScript tiene asincronicidad en un nivel de idioma. Por lo tanto, si implementa su función para que devuelva una promesa en lugar de aceptar una devolución de llamada, sabrá que las devoluciones de llamada enlazadas se activarán de forma asincrónica.


Las rellamadas que usted llama son llamadas a funciones regulares, que son siempre sincrónicas.

Algunas API nativas (p. Ej., AJAX, geolocalización, disco Node.js o API de red) son asíncronas y ejecutarán sus devoluciones de llamadas más adelante en el ciclo de eventos.

Si llama a una devolución de llamada de forma síncrona desde una devolución de llamada asíncrona, también terminará siendo asincrónica.


Para crear sus propias funciones asíncronas, debe hacer uso de otras funciones asíncronas que puede proporcionar el intérprete.

Este código, por ejemplo, define una función "addKeyHandler" que es asíncrona. Pero eso solo funciona porque document.onKey es llamado asincrónicamente por el motor JS. El motor de JavaScript puede proporcionar funcionalidad asíncrona porque el sistema operativo proporciona dicha funcionalidad que JS utiliza. El sistema operativo a su vez solo puede proporcionar funcionalidad asíncrona porque el hardware lo proporciona (llamado interrupciones de hardware).

Sin embargo, si el sistema operativo y el hardware no proporcionaran ninguna función asíncrona, aún sería posible escribir un intérprete JS. Pero tendría que usar un ciclo infinito y verificar cada iteración si ocurriera algún evento y luego invocar las devoluciones de llamada apropiadas. Eso significa que la CPU siempre estará bajo carga completa.

var keyCallbacks = []; var addKeyHandler = function(f) { keyCallbacks.push(f); }; document.onkeypress = function(e) { keyCallbacks.forEach(function(f) { f(e); }); }; addKeyHandler(function(e) { console.log(String.fromCharCode(e.charCode)); });