JavaScript/Objekte/Promise/try

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode Promise.try dient dazu, den Rückgabewert einer Funktion einheitlich als Promise zu liefern, egal, ob die Funktion synchron oder asynchron agiert. Dazu wird die übergebene Funktion synchron ausgeführt und der Rückgabewert auf ein Promise abgebildet.

Wie bei withResolvers geht es darum, ein häufig verwendetes Pattern zu standardisieren und falsche Implementierungen zu vermeiden.

Syntax

   const promise = Promise.try(funktion, ...argumente);

Parameter

funktion
eine beliebige Funktion, die synchron oder mittels Promise asynchron arbeiten kann
...argumente
beliebig viele Argumente, die an die Funktion übergeben werden sollen

Rückgabe

Ein Promise, das den Rückgabewert der Funktion als Wert besitzt.

Der Zustand des zurückgegebenen Promise hängt davon ab, was funktion tut.

funktion endet normal und gibt etwas zurück, das kein Thenable ist
Hinweis: ein Promise ist immer auch ein Thenable
Das Promise ist resolved und hat den Rückgabewert der Funktion als Wert.
funktion wirft einen Fehler (throw)
Das Promise ist rejected und enthält den geworfenen Wert
funktion gibt ein Thenable zurück
Wenn das Thenable auf einen settled-Zustand wechselt, übernimmt das zurückgegebene Promise dessen Zustand und Wert

Vergleichsimplementierungen

Man kann ohne Promise.try leben. Der folgende Polyfill-Code ist äquivalent, aber umständlicher:

Polyfill für Promise.try (ohne Subclass-Feature)
if (!Promise.try) {
   Promise.try = function(callback, ...args) {
      return new this( (resolve) => resolve(callback(...args)) );
   }
}

Wie bitte? new this(...)? Nun, try ist eine Methode der Promise-Konstruktorfunktion, deshalb ist this das Objekt, auf dem try aufgerufen wird. Falls jemand eine Subklasse Oath von Promise angelegt hat und Oath.try(...) verwendet, dann ist this der Oath-Kostruktor, so dass auch ein Oath statt eines Promise zurückgegeben wird.

Was nicht funktioniert, ist:

   const tryValue = Promise.resolve(function());

Falls die Funktion auf throw läuft, entsteht kein zurückgewiesenes Promise, sondern der throw bricht durch.

   const tryValue = Promise.resolve().then((dummy) => function());

Hier wird die Funktion asynchron aufgerufen, was unerwünscht sein kann. Promise.try() ruft die Funktion synchron auf.