JS中Promise的使用及封装方式

JS中Promise的使用及封装方式

什么是Promise

Promise 是 JS 中一种处理异步操作的机制。在 Promise 中,异步操作被封装成了一个对象,可以通过 then() 方法来处理异步操作的返回结果。

Promise 提供了三种状态:pending(等待态)、fulfilled(完成态)和rejected(拒绝态)。

  • pending:初始状态,既不是成功,也不是失败状态。
  • fulfilled:代表操作成功完成,返回了对应结果。
  • rejected:代表操作失败,返回对应错误信息。

通过使用 Promise,我们可以更清晰地表达异步操作的执行状态。

Promise的使用

基本用法

let promise = new Promise(function(resolve, reject) {
  // 异步代码
  // ...
  if(/* 异步操作成功 */) {
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) {
  // 异步操作成功处理
}, function(error) {
  // 异步操作失败处理
});

在 Promise 中,我们通过传入一个函数的方式来定义异步操作。该函数包含两个参数:resolve 和 reject。当异步操作成功完成时,我们通过 resolve() 方法来返回操作结果,并在 then() 里面处理成功的结果;而当异步操作失败时,则通过 reject() 方法返回错误信息,并在 catch() 中处理错误。

Promise嵌套

Promise 的 then() 方法可以返回一个新的 Promise 对象,这样可以将多个异步操作串联起来执行,从而避免了回调地狱的情况。

promise1.then(function(result1) {
  return promise2;
}).then(function(result2) {
  return promise3;
}).then(function(result3) {
  // 所有异步操作完成,在此处处理结果
}).catch(function(error) {
  // 异步操作出错,在此处处理错误
});

Promise.all

Promise.all() 方法可以将多个 Promise 对象包装成一个新的 Promise 实例,包装后的 Promise 对象的状态由所有的 Promise 对象的状态共同决定。

Promise.all([promise1, promise2, promise3])
  .then(function([result1, result2, result3]) {
    // 所有异步操作完成,在此处处理结果
  }).catch(function(error) {
    // 异步操作出错,在此处处理错误
  });

如果其中一个 Promise 对象的状态为 rejected,则整个 Promise.all() 的状态也会变为 rejected,这时候只会执行 Promise.all() 中的 catch() 方法。

Promise的封装

将异步操作封装成 Promise 对象可以提高代码的可读性和可维护性,同时也更方便在各处调用。我们可以将封装好的 Promise 作为插件或者命名空间的一部分提供。

封装示例一

function ajax(url, method, data) {
  return new Promise(function(resolve, reject) {
    let xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.onreadystatechange = function() {
      if(xhr.readyState === 4) {
        if(xhr.status === 200) {
          resolve(xhr.response);
        } else {
          reject(new Error(xhr.statusText));
        }
      }
    };
    xhr.onerror = function() {
      reject(new Error('网络错误'));
    };
    xhr.send(JSON.stringify(data));
  });
}

// 使用示例:
ajax('/api/test', 'POST', {name: 'test'}).then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.error(error);
});

我们可以将 ajax 函数封装成 Promise,返回一个 Promise 对象,然后在 then() 方法中处理成功的结果,在 catch() 方法中处理失败的情况。

封装示例二

let loadImage = function(url){
    return new Promise((resolve, reject)=>{
        let img = new Image();
        img.onload = function(){
            resolve(img);
        }
        img.onerror = function(){
            reject('加载失败');
        }
        img.src = url;
    });
}

// 使用示例:
loadImage('http://xxx.com/img.jpg').then(function(img) {
  console.log(img.width, img.height);
}).catch(function(error) {
  console.error(error);
});

我们可以将 loadImage 函数封装成 Promise,返回一个 Promise 对象,当图片加载成功时,在 then() 方法中返回 img 对象;当加载失败时,在 catch() 方法中返回错误信息。

总结

JS 中的 Promise 为我们处理异步操作提供了一种好的方法,其中封装的方式可以有多种,比如将异步操作封装成 Promise 函数、采用插件或者命名空间的方式等等,主要要考虑到代码的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中Promise的使用及封装方式 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 右键菜单中新建“文本文档”消失了的解决办法

    问题描述: 当在右键菜单中新建文件时,没有“文本文档”选项。这通常发生在升级 Windows 系统或安装了第三方软件之后。 解决办法: 要恢复“文本文档”选项,可以按照以下步骤操作: Step 1:打开注册表编辑器 在开始菜单中搜索“regedit”,然后在搜索结果中选择“注册表编辑器”,打开注册表编辑器。如果系统提示需要管理员权限,选择“是”。 Step …

    other 2023年6月27日
    00
  • java从object类型转换成double类型

    在Java中,从Object类型转换成double类型可以使用类型转换操作符或者Double类的parseDouble()方法。下面是两个示例说明: 示例1:使用类型转换操作符 Object obj = 3.14; double d = (double) obj; System.out.println(d); // 输出3.14 在上面的示例中,我们首先将一…

    other 2023年5月7日
    00
  • jenkins运行python脚本

    Jenkins运行Python脚本 Jenkins是一款流行的持续集成和持续部署工具,可以自动构建、测试和部署你的应用程序。它支持多种编程语言和技术,并且扩展性非常强,可以通过插件来适应不同的场景和需求。在本文中,我们将介绍如何使用Jenkins来运行Python脚本。 准备工作 在开始之前,需要准备以下工具和环境: 安装Jenkins服务器; 安装Pyth…

    其他 2023年3月28日
    00
  • gvim文本编辑器配置及相关插件安装图文教程

    下面我将详细讲解“gvim文本编辑器配置及相关插件安装图文教程”的完整攻略。 1. 安装gvim文本编辑器 首先,需要下载并安装gvim文本编辑器。可以通过以下步骤来完成: 在官网或者软件下载网站上下载gvim安装文件(根据你的电脑操作系统选择对应的版本),如 gvim82.exe。 双击安装文件,按照提示逐步进行安装。默认安装即可。 安装完成后,双击 gv…

    other 2023年6月26日
    00
  • DS-SDK封装ThreeJS的三维场景核心库Viewer

    DS-SDK是一个三维建模和可视化开发工具,能够帮助开发者快速完成三维场景的搭建和方案展示。其中封装的ThreeJS的三维场景核心库Viewer,是DS-SDK的重要组成部分之一,下面是该核心库的详细攻略。 1. DS-SDK封装ThreeJS的三维场景核心库Viewer DS-SDK的ThreeJS的三维场景核心库Viewer,可以快速实现三维模型导入、贴…

    other 2023年6月25日
    00
  • Ajax实现异步用户名验证功能

    实现异步用户名验证功能可以提高网站的用户体验,减少用户等待时间和提高网站流量。下面是实现该功能的攻略: 步骤一:新建HTML文件 新建HTML文件,包含一个用户名输入框和一个用于显示验证结果的信息框。HTML代码如下: <!DOCTYPE html> <html> <head> <meta charset=&quot…

    other 2023年6月27日
    00
  • springboot配置文件读取pom文件信息方式

    Spring Boot 是一个基于Spring框架的快速开发脚手架。使用Spring Boot 可以非常方便地开发Spring应用程序,并且避免手动配置等繁琐工作。 当我们在使用 Spring Boot 开发应用程序时,需要访问项目的 pom.xml 文件中的一些信息,例如应用程序的名称、版本号、打包方式等等。这些信息可以在 application .yml…

    other 2023年6月25日
    00
  • Bayesian statistics

    Bayesian Statistics Bayesian statistics is a branch of statistics that deals with the application of probability theory to statistical inference. It is based on the concept of Baye…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部