Skip to content

Grundlagen zu Tasks und Schedulern ​

Was ist synchrone Verarbeitung ​

Synchrone Verarbeitung wird sofort in der Reihenfolge ausgeführt, in der der Code geschrieben wurde, und geht nicht zum nächsten Vorgang über, bis der vorherige abgeschlossen ist.

Beispiel ​

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

// Ausgabe:
// A
// B
// C

Was ist asynchrone Verarbeitung ​

Asynchrone Verarbeitung wird nicht sofort ausgeführt, sondern nach Abschluss der aktuellen synchronen Verarbeitung. Es gibt "Macrotasks" und "Microtasks" bei der asynchronen Verarbeitung.

Macrotasks ​

  • Tasks, die im nächsten Zyklus des Event Loops ausgeführt werden.
  • Beispiele: setTimeout, setInterval, Browser-Events

Ausführungsbeispiel ​

ts
console.log('Start');
setTimeout(() => console.log('Macro Task'), 0);
console.log('End');

// Ausgabe:
// Start
// End
// Micro Task

Zuordnung in RxJS ​

  • asyncScheduler
    • Verwendet intern setTimeout
    • Funktioniert als Macrotask
ts
import { of, asyncScheduler } from 'rxjs';
import { observeOn } from 'rxjs';

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

// Ausgabe:
// Hello

Microtasks ​

  • Tasks, die unmittelbar nach Abschluss des aktuellen Tasks und vor Beginn des nächsten Tasks ausgeführt werden.
  • Beispiele: Promise.then, queueMicrotask

Ausführungsbeispiel ​

ts
console.log('Start');
Promise.resolve().then(() => console.log('Micro Task'));
console.log('End');

// Ausgabe:
// Start
// End
// Micro Task

Zuordnung in RxJS ​

  • asapScheduler
    • Verwendet intern Promise.resolve().then()
    • Funktioniert als Microtask
ts
import { of, asapScheduler } from 'rxjs';
import { observeOn } from 'rxjs';

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

// Ausgabe:
// Hi

Synchrone Tasks ​

  • Normaler Code, der sofort ausgeführt wird.

Zuordnung in RxJS ​

  • queueScheduler
    • Erscheint synchron, ermöglicht aber feinere Steuerung durch Task-Queuing.
ts
import { of, queueScheduler } from 'rxjs';
import { observeOn } from 'rxjs';

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

// Ausgabe:
// Now

Zusammenfassung der Ausführungsreihenfolge ​

Codebeispiel ​

ts
console.log('1');

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

console.log('4');

// Ausgabe:
// 1
// 4
// 3 (Promise) 👈 Microtask
// 2 (setTimeout) 👈 Macrotask

Zuordnungstabelle Tasks und RxJS-Scheduler ​

TypBeispielRxJS-Scheduler
Synchrone VerarbeitungNormaler CodequeueScheduler
MicrotaskPromise.then, queueMicrotaskasapScheduler
MacrotasksetTimeout, setIntervalasyncScheduler

Veröffentlicht unter CC-BY-4.0-Lizenz.