Tengo una duda de que JavaScript es un lenguaje de programación síncrono de un solo subproceso. y solo tiene One Callstack. Entonces, ¿cómo la devolución de llamada y la promesa logran la propiedad de Asycrones?
ellos no Las devoluciones de llamada y las promesas no hacen que nada sea asíncrono. En cambio, las devoluciones de llamada y las Promesas son patrones de diseño que permiten que las funciones asincrónicas interactúen con el resto de su código.
Los siguientes son dos ejemplos de devoluciones de llamada, uno es síncrono, uno es asíncrono:
function a (input, callback) { callback(input * 2); } function b (input, callback) { setTimeout(() => callback(input *2), 100); } console.log('start!'); a(100, x => console.log(x)); b(1000, x => console.log(x)); console.log('end!');La salida debe ser:
start! 200 end! 2000Las devoluciones de llamada no hacen que nada sea asíncrono, pero es una técnica que permite que el código asíncrono interactúe con otras partes de su código.
Las promesas reprograman su devolución de llamada .then() porque esa es la forma en que fue diseñada. Pero todo lo que hace es ejecutar .then() al final de su código. Eso es todo lo que hace, no ejecuta la devolución de llamada .then() en un hilo separado.
¿Cómo ejecuta su código más tarde? Bueno, tu código es una función. Simplemente lo llama más tarde. ¿Cómo se llama después? Simplemente agrega su función a una lista de cosas que deben hacerse más adelante. Al final de su código, el intérprete verificará esta lista (o listas) para ver si necesita hacer algo. Esta parte del código que verifica si es necesario ejecutar algo se llama bucle de eventos. Las cosas en la lista/listas que deben verificarse se denominan "tareas" o "microtareas" en la documentación.
Las funciones asíncronas son asíncronas. Se implementan usando C/C++. Entonces, si una pieza de código C/C++ usa subprocesos o señales o E/S asíncrona, puede dejar que el intérprete de javascript espere los resultados asíncronos usando devoluciones de llamada de javascript (simplemente acepta una función de javascript que llamará más tarde) o promesas (devuelve un objeto Promise de javascript).