Rolf B: Frage zu fetch und Übergabe von Array, Aufruf aus anderer .js

Beitrag lesen

Hallo Raketenwilli,

fetch ist genauso asynchron wie XmlHttpRequest, nur dass man beim XHR die klassische EventTarget-Schnittstelle verwendet und bei fetch die Promise-Schnittstelle.

Beide sind asynchron, beide sind im Moment des Sendens "fire and forget", beide bekommen ein Signal wenn der Request fertig oder fritte ist.

Der Unterschied zwischen Promise und EventTarget ist, dass Promises einfacher zu implementieren sind. Schreib mal selbst ein Objekt, das EventTarget implementiert - gar nicht so einfach, die addEventListener, removeEventListener und dispatchEvent Methoden korrekt zu bauen. Natürlich geht es - aber es gibt eben keinen fertigen Baukasten dafür. Promises schenken Dir das, und verpacken einen Teil der Komplexität.

Events können grundsätzlich mehr. Ein Promise resolved einmal und ist dann fertig, während Events beliebig oft feuern können. Aber die Einschränkung des Promise bedeutet auch eine einfachere Handhabung. Hinzu kommt, dass - vermute ich zumindest - Promises leichtgewichtiger sind. Ein erfülltes oder zurückgewiesenes Promise wird in der Microtask-Queue verarbeitet, während ein Event über die Eventqueue läuft. Ich bin nicht sicher, aber ich meine, dass die Eventqueue nach jedem Event erstmal eine Layout-Phase einschiebt, während die Microtask-Queue das nicht tut.

Und versuch mal, mit Events eine Verkettung hinzubekommen. Die Reihenfolge der Eventhandler eines Events ist nicht definiert. Aber eine Promise.then.then... Kette ist wohldefiniert. Genauso kompliziert ist es, eine Gruppe von nebenläufigen Aktionen zu koordinieren. Den Effekt von Promise.all mit Events nachzubauen ist sicher möglich, aber man muss es eben erstmal tun.

Beides hat seinen Sinn. Für eine nachvollziehbar gesteuerte Nebenläufigkeit sind Promises besser. Das Konzept ist - unter dem Namen 'Futures' - übrigens älter als JavaScript und in etlichen Sprachen verfügbar. In C# zum Beispiel über die Task-Klasse. Und ich kann sowohl in C# wie auch in JavaScript die Promises mit async/await überzuckern. Mit Events geht das nicht.

Rolf

--
sumpsi - posui - obstruxi