2016-03-14 14 views
131

Bluebird offre un metodo "finalmente" che viene chiamato qualunque cosa accada nella catena delle tue promesse. Lo trovo molto utile per la pulizia (come sbloccare una risorsa, nascondere un caricatore, ...)qual è l'equivalente di bluebird Promise.finally nelle promesse native di ES6?

Esiste un equivalente nelle promesse native ES6?

Ecco il riferimento documentazione per il metodo Infine:

http://bluebirdjs.com/docs/api/finally.html

Grazie

+2

Proposta ECMAScript (https://github.com/tc39/proposal-promise-finally) e il flag v8 (nodo --harmony_promise_finally app.js) esiste. – masakielastic

+0

Puoi provare il pacchetto 'when' https://www.npmjs.com/package/when – Arno

risposta

219

A partire dal 7 febbraio 2018

Chrome 63+, 58+ Firefox e Opera 50+ supporto Promise.finally.

In Node.js 8.1.4+ (V8 5.8+), la funzione è disponibile dietro la bandiera --harmony-promise-finally.

Il Promise.prototype.finally ECMAScript Proposal è attualmente in stage 3 del processo TC39.

Nel frattempo per avere promesse.finalmente funzionalità in tutti i browser; è possibile aggiungere un ulteriore then() dopo il catch() per richiamare sempre tale richiamata.

Esempio:

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

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

Oppure è possibile estendere il prototipo per includere un metodo finally() (sconsigliato):

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/moogs/c67a6ss0/1/

C'è anche la libreria shim Promise.prototype.finally.

+14

grazie! Userò una finale quindi :) –

+13

Vale la pena ricordare questo .catch() non catturerà solo l'errore di Promise originale, ma anche tutti gli errori lanciati nel gestore .then() originale. Quindi è facile sopprimere accidentalmente qualche messaggio di errore con questo codice. – Frax

+1

if (Promise.prototype.finally == undefined) { Promise.prototype.finally = function (callback) { return this.then (function (result) { return Promise.resolve (callback()). Then (function() {return risultato ; });} , la funzione (errore) { ritorno Promise.resolve (callback() errore) poi (function() { tiro;. });} ); }; } – 4esn0k