Was ist das Äquivalent von Bluebird Promise.finally in nativen ES6-Versprechungen? [duplicate]

Lesezeit: 2 Minuten

Benutzer-Avatar
Aric Lasri

Bluebird bietet a finally Methode, die aufgerufen wird, was auch immer in Ihrer Versprechenskette passiert. Ich finde es sehr praktisch für Reinigungszwecke (wie das Freischalten einer Ressource, das Verstecken eines Loaders, …)

Gibt es ein Äquivalent in den nativen Versprechungen von ES6?

Benutzer-Avatar
Miguel Mota

Stand 7. Februar 2018

Unterstützung für Chrome 63+, Firefox 58+ und Opera 50+ Promise.finally.

In Node.js 8.1.4+ (V8 5.8+) ist die Funktion hinter dem Flag verfügbar --harmony-promise-finally.

Das Versprechen.Prototyp.endlich ECMAScript-Vorschlag ist derzeit drin Stufe 3 des TC39-Prozesses.

Promise.finally-Funktionalität in der Zwischenzeit in allen Browsern zu haben; Sie können eine zusätzliche hinzufügen then() nach dem catch() um diesen Rückruf immer aufzurufen.

Beispiel:

myES6Promise.then(() => console.log('Resolved'))
            .catch(() => console.log('Failed'))
            .then(() => console.log('Always run this'));

JSFiddle-Demo: https://jsfiddle.net/9frfjcsg/

Oder Sie erweitern den Prototyp um a finally() Methode (nicht empfohlen):

Promise.prototype.finally = function(cb) {
    const res = () => this;
    const fin = () => Promise.resolve(cb()).then(res);
    return this.then(fin, fin);
};

JSFiddle-Demo: https://jsfiddle.net/c67a6ss0/1/

Es gibt auch die Promise.prototype.endlich Shim-Bibliothek.

  • Es ist erwähnenswert, dass .catch() nicht nur den Fehler des ursprünglichen Promise abfängt, sondern auch alle Fehler, die im ursprünglichen .then()-Handler ausgelöst werden. Es ist also leicht, versehentlich eine Fehlermeldung mit diesem Code zu unterdrücken.

    – Frax

    14. Juni 2017 um 22:32 Uhr

  • if (Promise.prototype.finally == undefined) { Promise.prototype.finally = function (callback) { return this.then(function (result) { return Promise.resolve(callback()).then(function () { return result; }); }, function (error) { return Promise.resolve(callback()).then(function () { throw error; }); }); }; }

    – 4esn0k

    9. August 2017 um 18:57 Uhr


  • Warum ist der prototype.finally Vorgehensweise nicht empfehlenswert?

    – Jan Hommes

    18. Oktober 2017 um 13:45 Uhr

  • Es dauerte eine Weile, bis ich herausfand, wie finally sollte einen Parameter als Status erhalten, unabhängig vom Promise-Resolution/Reject Promise.prototype.finally = function(cb) { const res = () => this const fin = (value) => Promise.resolve(cb(value)).then(res) return this.then(fin, fin)

    – As

    22. Oktober 2017 um 17:25 Uhr


  • @JanHommes Es wird niemals empfohlen, Prototypen mit benutzerdefinierten Methoden zu erweitern. Wenn die Spezifikation beschließt, eine native Implementierung von hinzuzufügen .finally() oder welche Methode Sie auch immer zum Prototyp hinzufügen, Sie würden am Ende eine fehlerhafte Implementierung erhalten und Ihre App funktioniert möglicherweise nicht mehr in neueren Browsern.

    – Jérôme Indefenzo

    7. Dezember 2017 um 16:06 Uhr

1277890cookie-checkWas ist das Äquivalent von Bluebird Promise.finally in nativen ES6-Versprechungen? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy