Vue四

vue复习笔记 Promise

125 promise的介绍和基本使用

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
setTimeout是一个异步操作 有了这个异步操作 以后可以对这个操作进行一些异步封装 用promise封装
promise就是对异步操作做一些封装
在这里插入图片描述在这里插入图片描述
PROMISE就是要求在创建的时候传递一些函数 但是传入的这两个函数本身也包含2个参数 resolve ,reject

有任何异步操作都可以直接封装在如下里面
new Promise((resolve  ,reject) => {
 
})

在这里插入图片描述
如上大音就已经出现了回调地狱
不希望在大括号里面嵌套一层又一层的话
那么就把如下代码抽离出去
在这里插入图片描述
调用resolve函数
一旦调用了resolve函数 就会在下面位置调用then

在这里插入图片描述在这里插入图片描述
then也是一个函数
在这里插入图片描述
就把刚才的那陀代码抽离出来放进去

},1000)

new Promise((resolve  ,reject) => {
    setTimeout(() => {
        resolve()
    },1000)
}).then(() =>{
  setTimeout(() => {
    console.log('Hello Word');
    console.log('Hello Word');
    console.log('Hello Word');

    setTimeout(() => {

    console.log('Hello Vuejs');
    console.log('Hello Vuejs');
    console.log('Hello Vuejs');

        setTimeout(() => {
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');
})

那么这些数据就可以在then里面处理了
把setTimeout看成是一次网络请求

如果上面的一百行代码处理完 还有下面的那些代码 可以剪切掉
在这里插入图片描述
在这里插入图片描述
然后意味着上面的那部分代码又可以剪掉
再调用一下resolve
在这里插入图片描述
然后再写一个tnen 依然是一个箭头函数
在这里插入图片描述

  return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve()
            }, 1000)
        })
    }).then(() =>{


                console.log('Hello Vuejs');
                console.log('Hello Vuejs');
                console.log('Hello Vuejs');

                setTimeout(() => {
                    console.log('Hello Python');
                    console.log('Hello Python');
                    console.log('Hello Python');
                    console.log('Hello Python');
                })
    })

在这里插入图片描述
然后发现下面还有一次网络请求
在这里插入图片描述
那么就再来一次newPromise

<script>
<!--1.使用setTimeout-->
// setTimeout(() => {
//  console.log('Hello Word');
//
// },1000)

//参数 ->函数
//函数本身又有2个参数(resolve  ,reject)  resolve  ,reject它们本身又是函数
new Promise((resolve  ,reject) => {
    setTimeout(() => {
        resolve()
    },1000)
}).then(() =>{
    setTimeout(() => {
        console.log('Hello Word');
        console.log('Hello Word');
        console.log('Hello Word');

        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve()
            }, 1000)
        })
    }).then(() =>{
        console.log('Hello Vuejs');
        console.log('Hello Vuejs');
        console.log('Hello Vuejs');
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve()
            })
            })
        }).then(() =>{
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');
    })
        })
</script>

都是对以下 第一次的结果处理
在这里插入图片描述
第一次发送网络请求
在这里插入图片描述
在这里插入图片描述

<script>
<!--1.使用setTimeout-->
// setTimeout(() => {
//  console.log('Hello Word');
//
// },1000)
链式编程
//参数 ->函数
//函数本身又有2个参数(resolve  ,reject)  resolve  ,reject它们本身又是函数
new Promise((resolve  ,reject) => {
//1.第一次网路请求的处理代码
    setTimeout(() => {
        resolve()
    },1000)
}).then(() =>{
    setTimeout(() => {
        //第一次拿到结果的处理代码
        console.log('Hello Word');
        console.log('Hello Word');
        console.log('Hello Word');
        return new Promise((resolve, reject) => {
            //第二次发送网络请求的代码
            setTimeout(() => {
                resolve()
            }, 1000)
        })
    }).then(() =>{
        //第二次处理的代码
        console.log('Hello Vuejs');
        console.log('Hello Vuejs');
        console.log('Hello Vuejs');
            return new Promise((resolve, reject) => {
                //第三次网络请求的代码
                setTimeout(() => {
                    resolve()
            })
            })
        }).then(() =>{
    //第三次处理的代码
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');

    })
        })
</script>

只要是网络请求的代码都是放在一个叫Promise对象里面
所有的处理代码都是在上一次Promise之后对应的then代码里面
即使有10次 代码的结构也是如此
一般情况下 是有异步操作时 使用Promise对异步操作进行封装
在这里插入图片描述
在这里插入图片描述
一旦reject它就会直接来到catch 把err message传到catch里面
在这里插入图片描述在这里插入图片描述
箭头函数只有一个参数的时候 小括号里面的内容 可以不写在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
126Promise的三种状态和另处理方式
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
如果不想通过then和catch可以在then处传入2个函数
在这里插入图片描述

new Promise((resolve,reject) => {
setTimeout(() =>{
resolve(‘Hello Vuejs’)
reject(‘error message’)
},1000)
}).then(函数1,函数2)

也可以
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

127 Promise的链式调用

<script>
 // 1.使用setTimeout
    // setTimeout(() => {
    //  console.log('Hello Word');
    //
    // },1000)
    // 链式编程
    //参数 ->函数
    //函数本身又有2个参数(resolve  ,reject)  resolve  ,reject它们本身又是函数
    new Promise((resolve  ,reject) => {
//1.第一次网路请求的处理代码
        setTimeout(() => {
            resolve()
        },1000)
    }).then(() =>{

            //第一次拿到结果的处理代码
            console.log('Hello Word');
            console.log('Hello Word');
            console.log('Hello Word');
            return new Promise((resolve, reject) => {
                //第二次发送网络请求的代码
                setTimeout(() => {
                    resolve()
                }, 1000)
            })
        }).then(() =>{
            //第二次处理的代码
            console.log('Hello Vuejs');
            console.log('Hello Vuejs');
            console.log('Hello Vuejs');
            return new Promise((resolve, reject) => {
                //第三次网络请求的代码
                setTimeout(() => {
                    resolve()
                })
            })
        }).then(() =>{
            //第三次处理的代码
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');
            console.log('Hello Python');

        })
</script>

在这里插入图片描述

//网络请求:aaa =>自己处理10行
    //处理:给aaa后面拼接111=>自己处理10行
//处理:aaa111222=>自己处理10行
new Promise((resolve,reject) =>{
    setTimeout(() => {
    resolve('aaa')
    },1000)
}).then(res => {
    //.自己处理10行代码
    console.log(res,'第一行的10行处理代码');
    //2  对结果进行第一次处理 给aaa后面拼接111=>自己处理10行
 return new Promise((resolve) => {
     resolve(res + '111')
 })
    //拿到下一次结果
}).then(res => {
    console.log(res,'第二行的10行处理代码');
    return new Promise((resolve) => {
        resolve(res + '222')
    })
}).then(res => {
    //.自己处理10行代码
    console.log(res,'第三行的10行处理代码');
})

如上 并没有进行异步操作 目的是拿到resolve之后 调用resolve 并且对结果做一些处理
只有第一个地方进行了异步操作
在这里插入图片描述
简写 如图可以把上面那些选中的删掉 换成下面选中的这种写法更加简洁
在这里插入图片描述
在这里插入图片描述
未简写前的代码处理结果在这里插入图片描述
简写后的代码处理结果
在这里插入图片描述

 更简洁的写法 省略掉Promise.resolve和()
new Promise((resolve,reject) =>{
    setTimeout(() => {
        resolve('aaa')
    },1000)
}).then(res => {
    //.自己处理10行代码
    console.log(res,'第一行的10行处理代码');
    //2  对结果进行第一次处理 给aaa后面拼接111=>自己处理10行
    return res + '111'
    //拿到下一次结果
}).then(res => {
    console.log(res,'第二行的10行处理代码');
    return res+ '222'
}).then(res => {
    //.自己处理10行代码
    console.log(res,'第三行的10行处理代码');
})

在这里插入图片描述
直接做一个return 到时候它内部会对这个res + ‘111’ 进行一次promise包装

上面考虑的是每一层都是成功的 如果某一层失败的话
如下就不会再执行下面选中的那一坨
在这里插入图片描述
它会直接来的catch那里
在这里插入图片描述
如果打印err每次都要写new Promise也很麻烦
也有简写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

128 Promise的all方法使用

在这里插入图片描述
如上 在开发中必须2个结果都有了才能进行下一步操作
如何判断2个请求都拿到结果了
网络请求不知道哪个先返回
就不好确定到底是在请求1里面处理还是在请求二里面处理
就定义一个函数
handleResult()
搞2个变量
进行判断 都为true时才进行处理结果

    //请求一
let isResult1 = false
let isResult2 = false
    $ajax({
        url:'',
        success:function(){
            console.log('结果1');
            isResult1 = true
            handleResult()
        }
    })

//请求er
$ajax({
    url:'',
    success:function(){
        console.log('结果1');
        let isResult2 = true
        handleResult()
    }
})
    
    function  handleResult() {
        if (isResult1 && isResult2){
            
        }
    }

但是Promise就可以包装2个异步请求 判断2个请求有没有都完成 在2个都完成时进行回调‘
在这里插入图片描述
都完成了就会来到then 这个then是一个数组
在这里插入图片描述
两个results分别对应发送的2个请求的结果
模拟打印
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值