There is currently a proposal (not yet part of the ECMAScript standard) to add a finally
callback to promises that will be executed regardless of whether the promise is fulfilled or rejected. Semantically, this is similar to the [finally
clause of the try
block](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch#The_finally_clause).
You would usually use this functionality for cleanup:
var loadingData = true;
fetch('/data')
.then(result => processData(result.data))
.catch(error => console.error(error))
.finally(() => {
loadingData = false;
});
It is important to note that the finally
callback doesn’t affect the state of the promise. It doesn’t matter what value it returns, the promise stays in the fulfilled/rejected state that it had before. So in the example above the promise will be resolved with the return value of processData(result.data)
even though the finally
callback returned undefined
.
With the standardization process still being in progress, your promises implementation most likely won’t support finally
callbacks out of the box. For synchronous callbacks you can add this functionality with a polyfill however:
if (!Promise.prototype.finally) {
Promise.prototype.finally = function(callback) {
return this.then(result => {
callback();
return result;
}, error => {
callback();
throw error;
});
};
}