Skip to content

Conocimientos Básicos de Tareas y Schedulers

¿Qué es el Procesamiento Síncrono?

El procesamiento síncrono se ejecuta inmediatamente en el orden en que está escrito el código, y no procede al siguiente proceso hasta que el proceso anterior se haya completado.

Ejemplo

ts
console.log('A');
console.log('B');
console.log('C');

// Salida:
// A
// B
// C

¿Qué es el Procesamiento Asíncrono?

El procesamiento asíncrono es procesamiento que no se ejecuta inmediatamente, sino que se ejecuta después de que el procesamiento síncrono actual haya terminado. El procesamiento asíncrono incluye "macrotareas" y "microtareas".

Macrotarea

  • Una tarea que se ejecuta en el siguiente ciclo del event loop.
  • Ejemplos: setTimeout, setInterval, eventos del navegador

Ejemplo de Ejecución

ts
console.log('Inicio');
setTimeout(() => console.log('Macrotarea'), 0);
console.log('Fin');

// Salida:
// Inicio
// Fin
// Macrotarea

Soporte de RxJS

  • asyncScheduler
    • Usa setTimeout internamente
    • Funciona como una macrotarea
ts
import { of, asyncScheduler } from 'rxjs';
import { observeOn } from 'rxjs';

of('Hola')
  .pipe(observeOn(asyncScheduler))
  .subscribe(console.log);

// Salida:
// Hola

Microtarea

  • Una tarea que se ejecuta inmediatamente después de que la tarea actual termina, pero antes de que comience la siguiente tarea.
  • Ejemplos: Promise.then, queueMicrotask

Ejemplo de Ejecución

ts
console.log('Inicio');
Promise.resolve().then(() => console.log('Microtarea'));
console.log('Fin');

// Salida:
// Inicio
// Fin
// Microtarea

Soporte de RxJS

  • asapScheduler
    • Usa Promise.resolve().then() internamente
    • Funciona como una microtarea
ts
import { of, asapScheduler } from 'rxjs';
import { observeOn } from 'rxjs';

of('Hola')
  .pipe(observeOn(asapScheduler))
  .subscribe(console.log);

// Salida:
// Hola

Tarea Síncrona

  • Código normal a ejecutar inmediatamente.

Soporte de RxJS

  • queueScheduler
    • Parece ser síncrono, pero permite un control fino a través de la puesta en cola de tareas.
ts
import { of, queueScheduler } from 'rxjs';
import { observeOn } from 'rxjs';

of('Ahora')
  .pipe(observeOn(queueScheduler))
  .subscribe(console.log);

// Salida:
// Ahora

Resumen del Orden de Ejecución

Ejemplo de Código

ts
console.log('1');

setTimeout(() => console.log('2 (setTimeout)'), 0);
Promise.resolve().then(() => console.log('3 (Promise)'));

console.log('4');

// Salida:
// 1
// 4
// 3 (Promise) 👈 Microtarea
// 2 (setTimeout) 👈 Macrotarea

Tabla de Correspondencia entre Tareas y Schedulers de RxJS

TipoEjemploScheduler de RxJS
SíncronoCódigo normalqueueScheduler
MicrotareaPromise.then, queueMicrotaskasapScheduler
MacrotareasetTimeout, setIntervalasyncScheduler

Publicado bajo licencia CC-BY-4.0.