Promise.prototype.finally()

finally() 方法返回一个 Promise。在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在 Promise是否成功完成后都需要执行的代码提供了一种方式。
这避免了同样的语句需要在 then()catch()中各写一次的情况。

语法

p.finally(onFinally);

p.finally(function() {
   // 返回状态为(resolved 或 rejected)
});

参数

onFinally
Promise 结束后调用的 Function

返回值

返回一个设置了 finally 回调函数的Promise对象。 

描述

如果你想在 promise 执行完毕后无论其结果怎样都做一些处理或清理时,finally() 方法可能是有用的。

finally() 虽然与 .then(onFinally, onFinally) 类似,它们不同的是:

  • 调用内联函数时,不需要多次声明该函数或为该函数创建一个变量保存它。
  • 由于无法知道promise的最终状态,所以finally的回调函数中不接收任何参数,它仅用于无论最终结果如何都要执行的情况。
  • Promise.resolve(2).then(() => {}, () => {}) (resolved的结果为undefined)不同,Promise.resolve(2).finally(() => {}) resolved的结果为 2
  • 同样,Promise.reject(3).then(() => {}, () => {}) (resolved 的结果为undefined), Promise.reject(3).finally(() => {}) rejected 的结果为 3

注意: 在finally回调中 throw(或返回被拒绝的promise)将以 throw() 指定的原因拒绝新的promise.

示例

let isLoading = true;

fetch(myRequest).then(function(response) {
    var contentType = response.headers.get("content-type");
    if(contentType && contentType.includes("application/json")) {
      return response.json();
    }
    throw new TypeError("Oops, we haven't got JSON!");
  })
  .then(function(json) { /* process your JSON further */ })
  .catch(function(error) { console.log(error); })
  .finally(function() { isLoading = false; });

规范

Specification Status Comment
ECMAScript Latest Draft (ECMA-262)
Promise.prototype.finally
Draft

浏览器兼容性

Update compatibility data on GitHub
Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js
finally() Chrome Full support 63 Edge Full support 18 Firefox Full support 58 IE No support No Opera Full support 50 Safari Full support 11.1 WebView Android Full support 63 Chrome Android Full support 63 Firefox Android Full support 58 Opera Android Full support 46 Safari iOS Full support 11.3 Samsung Internet Android Full support 8.0 nodejs Full support 10.0.0

Legend

Full support  
Full support
No support  
No support

参见