Show all projects!

JavaScript Promise erklärt anhand von PHP

// Task 1: Translate the story into code.

const onMyBirthday = (isKayoSick) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (!isKayoSick) {
        resolve(2);
      } else {
        reject(new Error("I am sad"));
      }
    }, 2000)
  });
};

console.time("Timer");


onMyBirthday(false)
  .then((result) => {
    console.timeLog("Timer");
    console.log(`I have ${result} cakes`);
  })
  .catch((error) => {
    console.timeLog("Timer");
    console.log(error);
  })
  .finally(() => {
    console.log("Party");
  });
<?php

function onMyBirthday(bool $isKayoSick): int
{
    sleep(2);
    if ($isKayoSick === false) {
        return 2;
    } else {
        throw new Exception("I am sad");
    }
}



$timeStart = microtime(true);

try {
    $result = onMyBirthday(false);
    echo microtime(true) - $timeStart . PHP_EOL;
    echo "I have $result cakes" . PHP_EOL;


} catch (Exception $e) {
    echo microtime(true) - $timeStart . PHP_EOL;
    echo $e;

} finally {
    echo "Party" . PHP_EOL;
}

Promise vs. try-catch

„A promise represents a single result of an asynchronous operation. It is not necessarily available at a specific time, but should become in the future.“

Als ich gestern das Promise, Async/Await in 20 minutes | JavaScript Tutorial angeschaut habe, ist mir der die Ähnlichkeit eines einfachen Promise zum try,catch,finaly in PHP aufgefallen. Um das einmal zu verdeutlichen habe ich die erste Beispielaufgabe von Thu Nghiem in PHP interpretiert, um es deutlich zu machen.

Wichtig ist, das in JavaScript die Codeausführung weiter läuft, solange man nicht explizit das Promise "auflöst". Das sleep(2) in PHP ist hier nur exemplarisch. Das ist z.b. in Javascript von Vorteil, wenn man den ein alert() oder confirm() verwendet, und mit dem Promise nicht den Browser "anhält", oder als typischer Fall die Abfrage einer API.

  • Statt dem "return new Promise()" in der onMyBirthday() Funktion, kann man auch alternativ die Funktion mit "const onMyBirthday = async (isKayoSick)" definieren. Damit wird der Rückgabewert der Funktion automatisch als Promise zurückgegeben.
  • Wenn man nicht mit "then/catch/finaly" in JavaScript arbeiten möchte, kann man eine Funktion, die ein Promise zurückgibt, direkt auflösen mittels "await onMyBirthday()".


Wer sich für Promise Implementierungen in PHP interessiert, sollte sich PHP-HTTP promise und Guzzle Promises anschauen. Ein gutes tutorial zu ReactPHP findet sich hier

Article relase date: / Last update: