Promise有哪些状态?
- 3种状态
- pending: 刚new出来的时候
- onfullfilled: 触发 resolve 方法后
- rejected: 触发 reject 方法后
promise的基本语法
<!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>Promise</title>
</head>
<body>
<!-- Promise: 是ES6新增的一个对象类型, 可以帮助实现异步函数的 同步执行效果; 解决之前的回调函数多层嵌套导致的 回调地狱 问题 -->
<script>
// 基本语法: 固定的需要熟练掌握
new Promise((resolve, reject) => {
// resolve的参数随便写
// resolve调用时会触发 then中的箭头函数
// resolve的参数, 会传递给then中的箭头函数
// resolve({ code: 200, msg: '我是resolve' })
// resolve(13)
// 调用reject 会触发 catch 中的箭头函数
// 其中的参数会传递给 箭头函数
reject(55)
// resolve 和 reject 是二选一, 不能同时触发
// 因为后续使用场景是 网络请求时使用: 要么成功要么失败
// 请求成功=触发resolve, 请求失败=触发reject
})
.then(res => {
console.log('res:', res)
})
.catch(err => {
console.log('err:', err)
})
</script>
</body>
</html>
以下是使用promise的例子
<!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>Promise的使用</title>
</head>
<body>
<script>
new Promise((resolve, reject) => {}).then(res => {}).catch(err => {})
//转化: 用函数封装第一部分
function checkUname() {
return new Promise((resolve, reject) => {
// 随机数>0.2 算成功
console.log('开始验证用户名...')
// 实际开发: 则此处是 ajax 的请求代码
setTimeout(() => {
// >0.2算成功, 触发 resolve->then; 否则触发 reject -> catch
Math.random() > 0.2 ? resolve('用户名OK') : reject('用户名ERR')
}, 1000)
})
}
//检查邮箱:
function checkEmail() {
// prom
return new Promise((resolve, reject) => {
console.log('开始查验邮箱...')
setTimeout(() => {
Math.random() > 0.2 ? resolve('邮箱OK') : reject('邮箱ERR')
}, 1000)
})
}
// 查验手机号
function checkPhone() {
// prom
return new Promise((resolve, reject) => {
console.log('开始查验手机号...')
setTimeout(() => {
Math.random() > 0.2 ? resolve('手机号OK') : '手机号ERR'
}, 1000)
})
}
// checkUname()的返回值, 就是 new Promise(...)
checkUname()
.then(res => {
console.log('res:', res)
// then: 是请求成功后触发的
// 此处应该返回下一次要发的请求
return checkEmail()
})
.then(res => {
// .then().then().then().then.....
// 每个then 都是上一个then返回的Promise 成功后触发的
console.log('res:', res)
return checkPhone()
})
.then(res => {
console.log('res:', res)
})
.catch(err => {
console.log('err:', err)
})
// 利用: 箭头函数的语法糖 省略{}和 return
checkUname()
.then(res => checkEmail())
.then(res => checkPhone())
.catch(err => console.log(err))
</script>
</body>
</html>
发送AJAX请求
<body>
<div class="container">
<h2 class="page-header">Promise 封装 AJAX 操作</h2>
<button class="btn btn-primary" id="btn">点击发送 AJAX</button>
</div>
<script>
//接口地址 https://api.apiopen.top/getJoke
//获取元素对象
const btn = document.querySelector('#btn');
btn.addEventListener('click', function(){
//创建 Promise
const p = new Promise((resolve, reject) => {
//1.创建对象
const xhr = new XMLHttpRequest();
//2. 初始化
xhr.open('GET', 'https://api.apiopen.top/getJoke');
//3. 发送
xhr.send();
//4. 处理响应结果
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
//判断响应状态码 2xx
if(xhr.status >= 200 && xhr.status < 300){
//控制台输出响应体
resolve(xhr.response);
}else{
//控制台输出响应状态码
reject(xhr.status);
}
}
}
});
//调用then方法
p.then(value=>{
console.log(value);
}, reason=>{
console.warn(reason);
});
});
</script>
</body>