Rolf B: Callback in Promise umschreiben

Beitrag lesen

Hallo Michael_K,

sieht gar nicht so falsch aus (nachtrag: Wenn das readCB gefixt ist), nur solltest Du noch option und values als Parameter an den Wrapper übergeben.

Dass beim Aufruf des Wrappers die then und catch Methoden auf dem zurückgegebenen Promise aufgerufen werden müssen, weißt Du sicher. Aber da gibt's einen Fallstrick.

Die typischen Beispiele sehen so aus:

promiseWrapper(foo, bar)
.then(readyCB)
.catch(errorCB);

Dieses Pattern ruft die errorCB Funktion auch dann auf, wenn readyCB einen Fehler produziert (sprich: eine Exception wirft oder ein rejectetes Promise zurückgibt). Das entspricht aber nicht deiner alten Verwendung. Wenn Du es exakt 1:1 haben willst, musst Du das Promise so benutzen:

promiseWrapper(foo, bar)
.then(readyCB, errorCB);

Auf diese Weise wird errorCB nur bei einem onerror des Workers aufgerufen.

Du gewinnst auf diese Weise aber kaum etwas. Du nimmst lediglich zwei Parameter aus dem Aufruf der workerFunction heraus und verschiebst sie in den Aufruf von then. Dafür bekommst Du die Komplexität eines Wrappers und der Promise-Klasse hinzu.

Wenn überhaupt, solltest du die workerFunction konsequent auf Promises umschreiben:

function promiseWork(option, values) {
   return new Promise( function(resolve, reject) {
      let worker = new Worker('worker.js');
      worker.onmessage = resolve;
      worker.onerror = reject;
      worker.postMessage(values);
   })
}

Fertig. Keine Abfragen mehr auf Callbacks, keine zwei Schichten. Wenn deine eigenen resultReceiver und errorReceiver Funktionen in der workerFunction noch weitere Dinge tun, dann kannst Du das mit internen then/catch Aufrufen erledigen:

function promiseWork(option, values) {
   return new Promise( function(resolve, reject) {
      let worker = new Worker('worker.js');
      worker.onmessage = resolve;
      worker.onerror = reject;
      worker.postMessage(values);
   })
   .then(function(data) {
            // tu was mit den Daten
            // Daten an nächsten then weitergeben
            return data;
         },
         function(err) {
            // tu was mit dem Fehler
            // Fehler an nächsten catch weitergeben
            return Promise.reject(err);
         });
}

Natürlich bist Du damit etwas weniger flexibel als mit deiner alten workerFunction. Insbesondere gibt es keine Logik mehr, die dazu führen könnte, dass weder ready noch error Callback aufgerufen werden. Keine Ahnung ob Du sowas brauchst, das geht aus deiner Vereinfachung nicht hervor.

Und man sollte dieses Konstrukt ggf. in weitere Funktionen zerlegen, ich vermute, dass sich da einiges an Redundanz ergibt.

Rolf

--
sumpsi - posui - clusi