JavaScript 用finally()执行清理
示例
当前有一个建议(尚未成为ECMAScript标准的一部分),finally向承诺中添加回调,无论承诺是被实现还是被拒绝,都将执行该回调。从语义上讲,这类似于块的finally子句try。
通常,您将使用此功能进行清理:
var loadingData = true;
fetch('/data')
.then(result => processData(result.data))
.catch(error => console.error(error))
.finally(() => {
loadingData = false;
});重要的是要注意,finally回调不会影响promise的状态。 它返回什么值都没有关系,诺言保持在它以前具有的已实现/已拒绝状态。 因此,在上面的示例中,即使finally回调返回了未定义的值,promise也将使用processData(result.data)的返回值进行解析。
由于标准化过程仍在进行中,您的promises实现很可能将不支持finally现成的回调。对于同步回调,您可以使用polyfill添加此功能:
if (!Promise.prototype.finally) {
Promise.prototype.finally = function(callback) {
return this.then(result => {
callback();
return result;
}, error => {
callback();
throw error;
});
};
}