Erstellen von erfüllten Promises in JavaScript

Manchmal kann es notwendig sein, ein bereits erfülltes Promise zu erstellen. Dafür gibt es zwei Methoden: Die Methode Promise.resolve erstellt ein erfolgreich erfülltes Promise, Promise.reject erstellt ein abgelehntes Promise. Als Parameter erhalten diese Methoden das, was zum Ergebnis oder Fehler des Promises wird.

Wann kann ein bereits erfülltes Promise nützlich sein? Schauen wir uns ein Beispiel an. Angenommen, wir haben eine Funktion, die eine Zahl als Parameter entgegennimmt, diese asynchron verarbeitet und ein Promise mit dem Ergebnis zurückgibt:

javascriptfunction func(num) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(num * num);
    }, 3000);
  });
}

Wir werden unsere Funktion wie folgt verwenden:

javascriptfunc(5).then(function(res) {
  console.log(res); // gibt 25 aus
});

Nehmen wir nun an, wir haben entschieden, dass wir unseren asynchronen Vorgang nur ausführen wollen, wenn die übergebene Zahl größer als Null ist. Andernfalls soll das Ergebnis der Funktion Null sein:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // Null-Ergebnis
  }
}

Jetzt gibt die Funktion jedoch entweder ein Promise oder eine Zahl zurück. Dadurch können wir nicht mehr die Methode then auf das Ergebnis der Funktion anwenden, da wir im Fall der Rückgabe einer Zahl einen Fehler erhalten:

javascriptfunc(0).then(function(res) { // Fehler, wir wenden die then-Methode auf Null an
  
});

Das Problem können wir mit Promise.resolve beheben:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // geben ein Promise zurück, keine Zahl
  }
}

Nehmen wir nun an, wir haben entschieden, dass wir für eine übergebene Null, Null zurückgeben sollen, und für Zahlen kleiner Null - eine Ausnahme. Dabei hilft uns die Methode Promise.reject:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else if (num === 0) {
    return Promise.resolve(0);
  } else {
    return Promise.reject('incorrect number'); // geben ein abgelehntes Promise zurück
  }
}