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; }); }; }