Promise

118 阅读4分钟

介绍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);

打印的结果为:

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

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

(成功 也就是调用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);
        })

附上原文链接:blog.csdn.net/Wang_x_y_/a…