热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ES6PromiseJavascript

ES6PromiseJavascript-目录#介绍Promise#Promise.prototype.then(onFulfilled,onRejected)#Promi

目录

# 介绍Promise

# Promise.prototype.then(onFulfilled,onRejected)

# Promise.prototype.catch(onRejected)

# Promise.prototype.finally(onRejected) 

# Promise.resolve() 

# Promise.reject()  

# Promise.all([]) 

# Promise.race([])

# 封装原生简易Ajax请求


# 介绍Promise

首先说下 Promise 也是个 构造函数 通过new 关键字来实例化一个promise对象 用来将一些异步操作给实现队列化 也就是可以讲异步操作变为同步 promise主要来解决回调地狱  最常见的就是用它来封装异步的请求数据

先来看一下这个promise的基本语法


    let p1 = new Promise((resolve, reject) => { })

    let p2 = new Promise((resolve, reject) => {
        resolve("成功的回调")
    })

    let p3 = new Promise((resolve, reject) => {
        reject("失败的回调")
    })

    
    console.log('p1', p1);
    console.log('p2', p2);
    console.log('p3', p3);

打印的结果为:

这里先说一下promise的三个状态:

(待定 也就是没调用resolve 或 reject  ) 

<fulfilled>  (成功 也就是调用resolve的时候会把这个pending改为fulfilled)

  (失败 也就是调用reject的时候会把这个pending改为rejected) 并且会有报错提醒

注:(promise的状态被修改了之后 就不能再修改了)

了解完它的状态后再来看看 它用resolve 和 reject 后的数据是如何来获取到的

Promise 原型(prototype)上有几个常用的Api :

# Promise.prototype.then(onFulfilled,onRejected)

解:两个参数 这两个参数都是回调函数 第一个回调函数里面可以接收到 resolve 返回的成功信息  第二个回调函数可以接收 reject返回的失败信息  

注:(一般都用下面的catch来接收reject返回的失败信息 then一般就接收resolve返回的成功信息)

# Promise.prototype.catch(onRejected)

解:一个参数 这个参数是个回调函数里面可以接收到reject返回的失败信息  

# Promise.prototype.finally(onRejected) 

解:一个参数 这个参数是个回调函数它是不管这个promise实例返回的是成功状态(resolve)还是失败状态(reject)是都用调用

下面来试着用一下它的这些方法

    let p2 = new Promise((resolve, reject) => {
       // reject("p2 失败的回调")
          resolve("p2 成功的回调")
    })

    let p3 = new Promise((resolve, reject) => {
        reject("p3 失败的回调")
    })

    let flag = true;
    let p4 = new Promise((resolve, reject) => {
        if (flag) {
           resolve("flag为true")
        } else {
            reject("flag为false")
        }
    })

    p2.then(res => {
        console.log(res);
    }, err => {
        // console.log(err);
    }).finally(() => {
        console.log('p2 不管成功和失败都会调用');
    })


    p3.catch((err) => {
        console.log(err);
    }).finally(() => {
        console.log('p3 不管成功和失败都会调用');
    })

    p4.then(res => {
        console.log('p4', res);
    }).catch(err => {
        console.log('p4', err);
    })

promise最大的特点就是可以链式调用 就像P4那个需要根据状态来决定返回的状态在我们异步请求的过程中我们也不知道后端会返回的是 false 还是 true 所以 用这样的链式调用就可以把两种情况都给写上

Promise 这个构造函数上面还有常用的 resolve、 reject 、all、race 等...下面我来给大家一 一举例来看看它们到底是如何使用的

# Promise.resolve() // 上面提起的resolve()简化后的样子

# Promise.reject()  // 上面提起的reject()简化后的样子

# Promise.all([]) // 一般都是用一个数组,把所有的Promise对象写到这个数组里 

特点: 所有的promise对象全返回成功状态时 就会调用.then 并以数组的形式返回所有的成功信息  只要有一个返回的是失败状态就会调用.catch 并且返回第一个失败信息

# Promise.race([])  // 一般都是用一个数组,把所有的Promise对象写到这个数组里 

特点: 根据这些promise对象首个返回的状态来决定调用走向 假如这些promise其中的某一个首先返回了一个失败状态那么就会调用.catch 否则调用 .then


    // #Promise.resolve
    let p1 = Promise.resolve("简化后的Promise成功回调")
    // #Promise.reject
    let p2 = Promise.reject("简化后的Promise失败回调")
    let p3 = Promise.resolve("简化后的Promise成功回调")


    // #Promise.all
    Promise.all([p1, p3]).then(values => {
        console.log(values);
    }).catch(err => {
        console.log(err);
    })

    // #Promise.race()
    Promise.race([p1, p2]).then(res => {
        console.log(res); 
    }).catch(err => {
        console.log(err);
    })

# 封装原生简易Ajax请求

介绍了这么多 那么它到底是干什么的  开头咱们已经提过说大部分用来封装异步请求数据的使用的那么现在给大家实现简单的Ajax 请求封装


        const baseUrl = 'https://api-hmugo-web.itheima.net/api/' //公共请求地址

        function AjaxFn(options) {
            const ajax = new XMLHttpRequest() // 实例化一个XML对象
              /*
                 open打开请求  有三个参数 
                 第一个参数 请求的方式
                 第二个参数 请求的路径
                 第三个参数 是否异步 默认是开启的
               */
          
            ajax.open(options.type || 'GET', baseUrl + options.url, true)

            // 向服务器发送请求 如果是POST请求 就需要将请求体参数放到send里
            ajax.send()
            return new Promise((resolve, reject) => {
                ajax.Onreadystatechange= () => {
                    if (ajax.readyState === 4 && ajax.status == 200) {

                        resolve(JSON.parse(ajax.responseText).message)

                    } else if (ajax.status != 200) {
                        switch (ajax.status) {
                            case 404:
                                reject({ status: 404, msg: '数据不存在' })
                                break
                            default:
                                reject({ status: 404, msg: '请求失败' })
                                break;
                        }
                    }
                }
            })

        }

        AjaxFn({
            type: 'GET',
            url: 'public/v1/goods/detail?goods_id=5004'
        }).then(res => {
            console.log(res);
        }).catch(err => {
            console.log(err);
        })

可能这篇文章有些仓促 没说点上的我会继续改进 希望能帮助到你们也便后续自己的复习 

谢谢!


推荐阅读
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • async/await 是现代 JavaScript 中非常强大的异步编程工具,可以极大地简化异步代码的编写。本文将详细介绍 async 和 await 的用法及其背后的原理。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 利用 JavaScript 和 Node.js 验证时间的有效性
    本文探讨了如何使用 JavaScript 和 Node.js 验证时间的有效性。通过编写一个 `isTime` 函数,我们可以确保输入的时间格式正确且有效。该函数利用正则表达式匹配时间字符串,检查其是否符合常见的日期时间格式,如 `YYYY-MM-DD` 或 `HH:MM:SS`。此外,我们还介绍了如何处理不同时间格式的转换和验证,以提高代码的健壮性和可靠性。 ... [详细]
author-avatar
嘿嘿可爱无罪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有