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个请求的结果
模拟打印