es6-promise学习与使用【含真实接口】

2023-11-20

es6-promise学习与使用

es6-promise介绍与基本使用

promise是ES6引入的异步编程的新解决方案,语法上市promise是一个构造函数,用来封装异步操作并可以获取奇成功或失败的结果【解决回调地狱问题】

  1. Promise构造函数 :Promise {excutor}{ }
  2. Promise.prototype.then方法
  3. Promise.prototype.catch方法

1. 实例化Promise对象
Promise对象有三个状态,初始化,成功,失败
实例化promise对象:

//实例化Promise对象【三个状态:初始化,成功,失败】
        const p = new Promise(function(resolve,reject){
            setTimeout(() => {
                let data = "数据库中的用户数据"
                //resolve调用
                resolve(data);
            }, 1000);
        });

调用成功和失败都会执行promise.then的方法,then的方法有两个参数,两个参数都是函数类型的值,每个函数都有一个形参,成功的执行then的第一个函数,失败的执行第二个执行参数,两个函数的形参分别是value和reason,成功的叫做value,失败的叫做reson。
调用then代码:

/*
	 调用成功,就会调用promise对象的then方法,
     then方法接受两个参数,
     两个参数都是函数类型的值,每个函数都有一个形参,成功的叫做value,失败的叫做reason
     调到resolve代表成功,读取状态成功,then就会执行第一个回调函数代码
     如果读取状态失败,调用带有
  */
p.then(
	   function(value){
         console.log(value);
       },
       function(reason){
	   }
)

成功调用输出:
promise实例化成功
读取失败的例子:

 const p = new Promise(function(resolve,reject){
            setTimeout(() => {
                //
                let data = "数据库中的用户数据"
                let err = "读取数据库失败"
                //resolve调用
                reject(err)
            }, 1000);
        });
        p.then(function(value){
            console.log(value);
        },function(reason){
            console.log(reason);
        })

promise实例化读取失败返回结果

es6-promise封装读取文件

原生js输出文件内容【请求文件内容属于异步】

//引入fs模块
const fs = require('fs');

//调用方法读取文件
fs.readFile('./resources/1.md',(err,data)=>{
    //如果失败则抛出错误
    if(err) throw err;
    //如果没有出错,则输出内容
    console.log(data.toString());
})

效果:
js原生读取文件
使用promise封装读取文件:

//3.使用promise封装
const p = new Promise(function(resolve,reject){
    fs.readFile("./resources/1.md",(err,data)=>{
        //判断读取失败
        if(err) reject(err);
        //如果成功
        resolve(data)
    })
})
p.then(
    function(value){
        console.log(value.toString());
    },
    function(reason){
        console.log(reason);
    })

效果:
使用promise封装读取文件
使用promise封装读取文件

es6-promise封装Ajax请求

  1. 原生Ajax请求数据
 <script>
        //接口地址:https://api.apiopen.top/getJoke

        //创建对象
        const xhr = new XMLHttpRequest();

        //初始化
        xhr.open("GET","https://api.apiopen.top/getJoke");

        //发送
        xhr.send();

        //4.绑定时间,处理响应结果
        xhr.onreadystatechange = function(){
            //判断
            if(xhr.readyState === 4){
                //判断响应状态吗 200-299
                if(xhr.status >= 200 && xhr.status < 300){
                    //表示成功
                    console.log(xhr.response);
                }else{
                    //如果失败
                    console.log(xhr.status);
                }
            }
        }
    </script>

请求成功效果:
原生Ajax请求数据
请求失败结果:
原生Ajax请求数据
2. Promise进行封装Ajax代码

<script>
        //接口地址:https://api.apiopen.top/getJoke

        const p = new Promise((resolve,reject)=>{

        //创建对象
        const xhr = new XMLHttpRequest();

        //初始化
        xhr.open("GET","https://api.apiopen.top/getJoke");

        //发送
        xhr.send();

        //4.绑定时间,处理响应结果
        xhr.onreadystatechange = function(){
            //判断
            if(xhr.readyState === 4){
                //判断响应状态吗 200-299
                if(xhr.status >= 200 && xhr.status < 300){
                    //表示成功
                    resolve(xhr.response)
                }else{
                    //如果失败
                    reject(xhr.status);
                }
            }
        }
    });
    //指定回调
    p.then(
    function(value){
        console.log(value);
    },
    function(reason){
        console.log(reason);
    })
    </script>

成功效果:
Promise进行封装Ajax代码
失败效果:
Promise进行封装Ajax代码
处理方式不一样,原来是在回调函数里面处理成功和失败的结果,promise实在异步任务的后面通过then来指定回调,结构清晰,也不会产生回调地狱的问题。

es6-Promise.prototype.then方法

  1. then返回结果:返回结果是由执行函数的回调结果来决定的,如果回调函数中返回的结果是 ||promise类型的属性,状态为成功,返回值为对象的成功值。

  2. then返回非Promise对象

//创建promise对象
   const p = new Promise((resolve,reject)=>{
       setTimeout(()=>{
          //resolve("请求成功")
          reject("请求失败")
       },1000)
   });

   //调用 then方法
   const result = p.then(value =>{
       console.log(value);
       return value;
   },reason =>{
       console.log(reason);
       return reason;
   })
   console.log(result);

Promise.prototype.then方法返回结果
Promise.prototype.then方法返回结果
不写return返回undefined结果:
Promise.prototype.then方法返回结果
3. then返回Promise对象
then返回Promise对象,then中promise的状态就决定了then方法返回的一个对象的状态,then中Promise的失败就决定了then方法返回的一个失败的状态。

//创建promise对象
   const p = new Promise((resolve,reject)=>{
       setTimeout(()=>{
          resolve("请求成功")
          //reject("请求失败")
       },1000)
   });

   //调用 then方法
   const result = p.then(value =>{
       return new Promise((resolve,reject)=>{
           resolve('ok')
       })
   },reason =>{
       console.log(reason);
   })
   console.log(result);

then返回Promise对象
then返回Promise对象
4. then抛出错误
【如果抛出错误的话,这个状态也是一个失败的Promise状态,错误的值就是抛出的值】

//创建promise对象
   const p = new Promise((resolve,reject)=>{
       setTimeout(()=>{
          resolve("请求成功")
          //reject("请求失败")
       },1000)
   });

   //调用 then方法
   const result = p.then(value =>{
       //抛出错误
       throw new Error("出错啦")
   },reason =>{
       console.log(reason);
   })
   console.log(result);

效果:
then抛出错误
既然then的方法可以返回promise对象,所以说then方法可以链式调用,链式调用[then方法指定回调的时候是可以只指定一个的,可以通过链式调用来改变回调地狱的问题]
格式:

p.then(value=>{
    //异步任务
},reason=>{
 //异步任务
}).then(value=>{
     //异步任务
},reason=>{
 //异步任务
})

es6-promise实践练习-多个文件内容读取

        //回调地狱容易重名,很不容易被发现
  1. 使用回调地狱方式来做
//引入fs模块
const fs = require("fs")

fs.readFile('./resources/1.md',(err,data)=>{
    fs.readFile('./resources/2.md',(err,data1)=>{
        fs.readFile('./resources/3.md',(err,data2)=>{
            let result = data+"\r\n"+data1+"\r\n"+data2
            console.log(result);
        });
    });
});

上面代码可以发现 ,回调地狱容易重名,很不容易被发现。
Promise实现:

//使用promise来实现
const p = new Promise((resolve,reject)=>{
    fs.readFile("./resources/1.md",(err,data)=>{
        resolve(data);
    })
})
p.then(value=>{
    return new Promise((resolve,reject)=>{
        fs.readFile("./resources/2.md",(err,data)=>{
            resolve([value,data]);
        });
    });
}).then(value=>{
    return new Promise((resolve,reject)=>{
        fs.readFile("./resources/3.md",(err,data)=>{
            //压入
            value.push(data);
            resolve(value)
        });
    });
}).then(value=>{
    console.log(value.join('\r\n'));
})

promise实现多个文件内容读取

es6-Promise对象catch方法

catch用来指定promise失败的一个回调

第一种方式代码:

 <script>
        const p = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                //设置p对象的状态为失败,并且设置失败的值
                reject("出错啦")
            })
        })
        p.then(function(value){

        },function(reason){
            console.error(reason);
        })
    </script>

效果:
Promise中的catch方法

第二种方式代码:

<script>
        const p = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                //设置p对象的状态为失败,并且设置失败的值
                reject("出错啦")
            })
        })
        p.catch(function(reason){
            console.warn(reason);
        })
    </script>

Promise中的catch方法

完结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

es6-promise学习与使用【含真实接口】 的相关文章

随机推荐

  • sudo配置文件/etc/sudoers详解及实战用法

    一 sudo执行命令的流程 将当前用户切换到超级用户下 或切换到指定的用户下 然后以超级用户或其指定切换到的用户身份执行命令 执行完成后 直接退回到当前用户 具体工作过程如下 当用户执行sudo时 系统会主动寻找 etc sudoers文件
  • hudi概念

    近实时摄取 对于 RDBMS 关系型的摄入 Hudi提供了更快的 Upset 操作 例如 你可以通过 MySql binlog 的形式或者 Sqoop 导入到 hdfs上的对应的 Hudi表中 这样操作比 Sqoop 批量合并 job Sq
  • tomcat进程意外退出的问题分析

    节前某个部门的测试环境反馈tomcat会意外退出 我们到实际环境排查后发现不是jvm crash 日志里有进程销毁的记录 从pause到destory的整个过程 org apache coyote AbstractProtocol paus
  • RNA-seq——四、根据序列比对结果筛选差异基因

    目录 1 合并矩阵并进行注释 2 筛选差异基因 DESeq2 写在前面 经过前面的一系列分析 我们得到了几个counts数据 接下来就需要根据这些数据来进行分析 本文使用Rstudio 从序列比对结果中筛选出差异基因 目的是 根据不同基因的
  • 在使用服务器时,配置torch环境(这里是以tengxunyun为例子配置的环境)

    这里配置的环境是使用的bubbliiiing的代码为例子进行配置的 配置环境需要对应自己电脑的显卡以及CUDA版本 最重要是torch的安装 一定要去官网去找对应的版本 1 conda create n pytorch python 3 6
  • 【Vue3.0实战逐步深入系列】使用elementui组件库element-plus美化投票功能

    千字长文 熬夜更新 原创不易 多多支持 感谢大家 前言 小伙伴们大家好 前面一篇文章中我们利用vue3 0实现了一个超级简单的投票功能 虽然功能是实现了也达到了巩固vue3 0知识点的目的 但是页面没有添加任何样式也没有进行任何的UI设计
  • 软件工程基础知识--系统测试

    系统测试与调试 1 系统测试的意义和目的 系统测试是为了发现错误而执行程序的过程 以最少的人力和时间发现潜在的各种错误和缺陷 根据测试的概念和目的 在进行信息系统测试时应遵循以下基本原则 1 应尽早并不断地进行测试 2 测试工作应该避免由原
  • python入门之字符串

    目录 一 字符串的定义 二 字符串的常用操作 三 字符串的切片 一 字符串的定义 字符串就是一串字符 是编程语言中表示文本的数据类型 在python中可以使用一对双引号 或者一对单引号 定义一个字符串 虽然可以使用 或者 做字符串的转义 但
  • 区块链数字存证平台有哪些功能模块

    区块链数字存证平台通常包括以下功能模块 数字存证 将数字文件的哈希值存储到区块链上 确保文件的完整性和不可篡改性 时间戳 记录数字文件的创建时间和存证时间 确保存证的时效性和证据的可信度 鉴定证书 提供数字文件的鉴定证书 证明文件的真实性和
  • 第7章 Linux文件过滤及内容编辑处理

    第7章 Linux文件过滤及内容编辑处理 在第5章 我们讲解了Linux系统文件及目录处理的基本命令知识和应用实践 本章继续为大家讲解处理Linux系统文件内容的一些核心命令 这些命令同样十分重要 7 1 vi vim 纯文本编辑器 Win
  • Fedora又一次哑了,又如何?

    Fedora自从34版本开始使用PipeWire代替原来的PulseAudio 每次更新系统版本就让用户产生怀疑的态度 此前我就写过一篇 Fedora 34成哑巴了 结果在Fedora35又失效了 原因是Fedora35选择WirePlum
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • adb链接夜神模拟器以及常用的adb命令整理

    夜神模拟器链接adb 1 打开夜神模拟器 打开设置 调成手机模式 初次进入的话 进入设置 点击版本号5次 可以激活使用开发者模式 进入后打开USB调试功能 2 打开文件资源管理器 进入夜神模拟器的安装位置 在地址栏输入cmd 回车 会打开c
  • 步进电机基础(5.6)-步进电机的驱动与控制-闭环控制

    步进电机基础 5 6 步进电机的驱动与控制 闭环控制 前言 基本信息 前言说明 5 6 闭环控制 前言 基本信息 名称 描述说明 教材名称 步进电机应用技术 作者 坂本正文 译者 王自强 前言说明 根据我读的 步进电机应用技术 这本书 进行
  • linux下动态共享库的创建,使用与更新(包括ldconfig的使用) 分类: Linux/Unix 2010-09-23 16:50 701人阅读 评论(0) 收藏 举报 linuxlibraryp

    linux下动态共享库的创建 使用与更新 包括ldconfig的使用 分类 Linux Unix 2010 09 23 16 50 701人阅读 评论 0 收藏 举报 linux library path file object cache
  • KMP求重复字符串——HDU1358

    这个题目蛮有意思的 大家都说用到了什么KMP的灵魂 next 数组的应用 可是也没见哪个人给我来个很正式的数学推导 到最后也只是看到了一个博客上写的是由观察得来的结论 http blog csdn net lizhihaoweiwei ar
  • Visual studio 2005 hangs on startup AppHangXProcB1 svchost devenv.exe svchost.exe:{2a811bb2-303b-48b...

    This problem has been torturing me for the whole afternoon and after searching on the web for a long time I finally get
  • amd关闭超线程_直接提高40帧?超线程开启/关闭游戏对比测试

    CPU处理器的核心数在不断提升 如今桌面端消费级市场基本起步都是4核心 高端一些的都达到了8核心 AMD甚至在去年还推出了16核心32线程的处理器 多核心线程的CPU在应用中会有更多的表现机会 而处理器能实现更多核心线程则依靠了英特尔和AM
  • Spring IOC容器

    什么是IOC IOC Inverse of Control 控制反转 将对象的创建权力反转给Spring框架 在java当中一个类想要使用另一个类的方法 就必须在这个类当中创建这个类的对象 那么可能会出现如下情况 比如A类当中创建着B对象
  • es6-promise学习与使用【含真实接口】

    es6 promise学习与使用 es6 promise介绍与基本使用 promise是ES6引入的异步编程的新解决方案 语法上市promise是一个构造函数 用来封装异步操作并可以获取奇成功或失败的结果 解决回调地狱问题 Promise构