文章目录
1、认识promise
1.1、做什么
异步编程的一种解决方案
1.2、何时处理异步事件
- 网络请求(比如 3+7=10 不能将结果返回)
- 网络请求中传入另外一个函数,数据请求成功时候,将数据传入的函数回调处理
1.3、回调地狱
1.3.1、需求说明
需要通过url1从服务器加载数据data1,data1包含下一个请求url2
需要通过url2从服务器加载数据data1,data1包含下一个请求url3
需要通过url2从服务器加载数据data1,data1包含下一个请求url4
1.3.2、伪代码
$.ajax('url1',function(data1){
$.ajax(data1['url2'],function(data2){
$.ajax(data2['url3'],function(data3){
$.ajax(data3['url4'],function(data4){
console.log(data4);
})
})
})
})
1.3.3、代码出现的问题
- 正常情况,不会有问题,可以获取想要的结果
- 这样代码难看不移维护
- 希望优雅的方式进行异步操作
1.3.4、如何做
promise可以以一种优雅方式解决这种问题
2、promise基本使用
2.1、定时器的异步事件
需求说明
使用定时器模拟异步事件
- 假设下面data是从网络上一秒后请求的数据
- console.log就是我们的处理凡是
这个例子感觉我们有点多余
- 首先promise代码明显比上面代码复杂
- 其次promise包含resole,reject,then,catch什么东西
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 说明
// Promise有两个参数 resole reject 表示成功时调用 失败时调用的函数
// 调用resole函数时 会将数据传入.then方法里面
// 调用reject函数时 会将数据传入.catch方法里面
new Promise((resolve, reject) => {
setTimeout(() => {
// resolve('hello world');
reject('hello vuejs')
}, 1000);
}).then((data) => {
console.log(data)
}).catch((error) => {
console.log(error)
})
</script>
</body>
</html>
另外处理形式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
new Promise((resolve, reject) => {
setTimeout(() => {
// resolve('hello vuejs')
reject('hello js')
}, 1000);
}).then((data) => {
console.log(data)
}, error => {
console.log(error)
})
</script>
</body>
</html>
效果图
2.2、定时器的异步解析
- new Promise创建一个Promise对象
- ((resole,reject) => {}) 是一个函数,箭头函数
- resole,reject也是两个函数,请求成功和失败决定调用哪一个
- 成功还是失败
- 成功,调用resolve(message),then被调用
- 失败,调用reject(message),catch被调用
2.3、promise的三种状态
pending
等待状态,比如正在进行网络请求,或者定时器没有到时间
fulfill
满足状态,当我们主动回调resolev,处于该状态 回调then
reject
拒绝状态,当主动调用reject,处于该状态,回调catch
3、promise链式调用
3.1、流程
版本1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello vuejs')
}, 1000)
}).then(data => {
console.log(data)
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello js')
}, 1000);
}).then(data => {
console.log(data)
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hell java')
}, 1000);
}).then(data => {
console.log(data)
})
})
})
</script>
</body>
</html>
版本2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello vuejs')
}, 1000)
}).then(data => {
console.log(data)
return Promise.resolve(data + 1)
}).then(data => {
console.log(data)
return Promise.resolve(data + 2)
}).then(data => {
console.log(data)
return Promise.resolve(data + 3)
}).then(data => {
console.log(data)
})
</script>
</body>
</html>
效果图
说明
这里直接通过Promise包装了一下新的数据,将promise对象返回
- promise.resolve():将数据包装成promise对象,并且在内部回调resolve函数
- promise.reject():将数据包装成promise对象,内部回调reject函数在·
版本3
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello vuejs')
}, 1000)
}).then(data => {
console.log(data)
return data + 1
}).then(data => {
console.log(data)
return data + 2
}).then(data => {
console.log(data)
return data + 3
}).then(data => {
console.log(data)
})
</script>
</body>
</html>
关键代码
效果图
说明
如果希望将数据直接包装成Promise.resolve,那么在then中可以直接返回数据
return Promise.resolve(data) =》return data;