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