ES10 中的新特性:Promise.prototype.finally() 的实战应用

ES10 中的新特性:Promise.prototype.finally() 的实战应用

在前端开发中,异步操作是不可避免的。而 Promise 对象,是一种用于处理异步操作的标准化解决方案,其可以优雅地处理异步回调地狱问题。在 ES10 中,Promise 对象新增了一个实用的方法:Promise.prototype.finally(),本文将介绍其用法及实战应用。

Promise.prototype.finally() 方法

Promise.prototype.finally() 方法返回一个新的 Promise 对象,该对象在 Promise 对象状态改变后(无论是 resolve 还是 reject),都会执行指定的回调函数。该方法带有一个函数参数,该函数会在 Promise 对象已经 settled(即变成fulfilled 或 rejected)后被调用。该方法主要用于无论 promise 被 reject 还是 resolve 都要执行的任务。

Promise.prototype.finally(onFinally)

参数:onFinally 是当 Promise 对象 settle 时要调用的函数。

返回值:返回一个新的 Promise 对象。

实战应用

下面我们将以实际应用中常见的场景为例,来介绍 Promise.prototype.finally() 的使用方法。

场景:Ajax 请求数据时,在请求的过程中需要显示一个加载中的提示,请求完成后需要隐藏该提示。

传统方法:

我们可以定义一个 showLoading 和 hideLoading 方法,用于显示和隐藏加载提示:

function showLoading() {
  // 显示加载提示
}
function hideLoading() {
  // 隐藏加载提示
}

然后在请求的过程中,则需要手动调用这两个方法:

showLoading();
$.ajax({...})
.done(function(data){ 
  // 请求成功处理 
})
.fail(function(status){ 
  // 请求失败处理 
})
.always(function(){ 
 hideLoading(); 
});

可以看到,在 Promise 对象中使用传统的方式,代码会变得很冗长。而使用 Promise.prototype.finally() 方法,可以有效地简化代码,实现如下:

showLoading();
$.ajax({...})
  .then(function(data) { 
    // 请求成功处理 
  })
  .catch(function(status) { 
    // 请求失败处理 
  })
  .finally(function() { 
    hideLoading(); 
  });

可以看到,使用 Promise.prototype.finally() 方法可以简化代码,更加优雅。

还有一个实际应用的例子是对请求时的状态进行更详细的输出,例如,前端请求数据时,需要打印请求参数,请求地址以及请求响应结果。这时,可以使用 Promise.prototype.finally() 方法来实现这一需求:

function fetchApi(url, params) {
 console.log(`请求地址:${url}, 请求参数:${params}`);
 showLoading();
 fetch(url, params)
 .then(response => response.json())
 .then(data => {
   console.log("请求成功,data:", data);
   // 处理请求响应结果
 })
 .catch(error => {
   console.log("请求失败,error:", error);
   // 处理请求错误
 })
 .finally(() => {
   hideLoading();
 });
}

在这里我们通过 console.log 输出了请求地址和参数,并在请求成功和失败时分别输出了响应和错误信息。

总结

在实际开发中,Promise 对象是不可避免的,而 Promise.prototype.finally() 方法的出现,旨在帮助开发者更加优雅地处理一些无论 resolve 还是 reject 时都需要执行的任务。在本文中,我们通过实际场景的演示,掌握了 Promise.prototype.finally() 方法的使用,希望能对前端开发者有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e3142add4f0e0ff73eac3


纠错反馈