Promises haben die Landschaft von JavaScript verändert. Viele alte APIs wurden wiedergeboren, um Promises (XHR to fetch, Battery API) zu verwenden, während neue APIs zu Promises tendieren. Entwickler können verwenden async
/await
mit Versprechungen umgehen, oder then
/catch
/finally
mit Rückrufen, aber was Promises Ihnen nicht mitteilt, ist ihr Status. Wäre es nicht toll, wenn die Promise.prototype
bereitgestellte Entwickler a status
Eigenschaft zu wissen, ob ein Versprechen abgelehnt, gelöst oder einfach nur getan wurde?
Meine Recherchen führten mich zu dieses Wesentliche was ich ziemlich clever fand. Ich nahm mir etwas Zeit, um ein bisschen Code zu ändern und Kommentare hinzuzufügen. Die folgende Lösung bietet Hilfsmethoden zum Bestimmen des Status eines Promise:
// Uses setTimeout with Promise to create an arbitrary delay time // In these examples, a 0 millisecond delay is // an instantly resolving promise that we can jude status against async function delay(milliseconds = 0, returnValue) { return new Promise(done => setTimeout((() => done(returnValue)), milliseconds)); } // Promise.race in all of these functions uses delay of 0 to // instantly resolve. If the promise is resolved or rejected, // returning that value will beat the setTimeout in the race async function isResolved(promise) { return await Promise.race([delay(0, false), promise.then(() => true, () => false)]); } async function isRejected(promise) { return await Promise.race([delay(0, false), promise.then(() => false, () => true)]); } async function isFinished(promise) { return await Promise.race([delay(0, false), promise.then(() => true, () => true)]); }
Ein paar Anwendungsbeispiele:
// Testing isResolved await isResolved(new Promise(resolve => resolve())); // true await isResolved(new Promise((_, reject) => reject())); // false // Testing isRejected await isRejected(new Promise((_, reject) => reject())); // true // We done yet? await isFinished(new Promise(resolve => resolve())); // true await isFinished(new Promise((_, reject) => reject())); // true
Entwickler können jederzeit eine weitere hinzufügen await
oder then
zu einem Versprechen, etwas auszuführen, aber es ist interessant, den Status eines bestimmten Versprechens herauszufinden. Gibt es eine einfachere Möglichkeit, den Status eines Versprechens zu erfahren? Gib mir Bescheid!