为什么需要Promise
需求:通过AJAX请求id ,再根据id请求用户名.再根据用户名,再根据用户名获取email
以上就是经典的回调地狱问题,回调函数中嵌套回调,而Promise解决了回调地狱问题
Promise的基本使用
语法:new Promise((resolve,reject)=>{})
- Promise接受一个函数作为参数
- 在匿名函数中有两个参数
- resolve():成功时才调用
- reject():失败时才调用
Promise实例有两个属性
- state:状态
- result:结果
Promise的状态
- 第一种状态: pending
- 第二种状态: fulfilled
- 第三种状态: rejected
Promise状态的改变
const p = new Promise((resolve, reject) => {
//resolve(): 调用函数, 使当前Promise对象的状态改成fulfilled
reslove();
})
console.dir(p) // fulfilled
示例2
const p = new Promise((resolve, reject) => {
//resolve(): 调用函数, 使当前Promise对象的状态改成fulfilled
//reject(): 调用函数, 使当前Promise对象的状态改成rejected
//reslove();
reject()
})
console.dir(p)
- resolve(): 调用函数, 使当前Promise对象的状态改成fulFilled
- reject(): 调用函数,使当前Promise对象状态改成rejected
Promise结果
const p = new Promise((resolve, reject) => {
//通过调用reslove,传递参数,改变 当前Promise对象的结果
resolve("成功的结果");
//reslove();
//reject("失败的结果")
})
console.dir(p)
Promise的方法
then方法
示例一
const p = new Promise((resolve, reject) => {
//通过调用reslove,传递参数,改变 当前Promise对象的结果
//reslove("成功的结果");
reject("失败的结果")
})
//then方法函数
//参数
//两个参数都是函数
//返回值: 是一个Promise对象
p,then(()=>{
//当Promise的状态使fulfilled时执行
console.log("成功的回调")
},()=>{
// 当Promise的状态时rejected时, 执行
console.log("失败时调用")
})
console.dir(p)
示例二
const p = new Promise((resolve, reject) => {
//通过调用reslove,传递参数,改变 当前Promise对象的结果
//reslove(123);
reject("失败的结果")
})
//then方法函数
//参数
//两个参数都是函数
//返回值: 是一个Promise对象
p.then((value)=>{
//当Promise的状态使fulfilled时执行
console.log("成功的回调",value)
},(err)=>{
// 当Promise的状态时rejected时, 执行
console.log("失败时调用",err)
})
console.dir(p)
如果Promise的状态改变,then里的方法不会执行
const p = new Promise((resolve, reject) => {
}).then.((value) => {
console.log("成功")
},(reason) => {
console.log("失败")
})
在then方法中,通过return将返回的Promise实例改为fulfilled状态
const p = new Promise((resolve, reject) => {
})
const t = p.then.((value) => {
console.log("成功")
//使用return可以将t实例的状态改为fulfilled
return 123
},(reason) => {
console.log("失败")
})
t.then.((value) => {
console.log("成功2",value)
},(reason) => {
console.log("失败2")
})
在then方法中,出现代码错误,将返回的Promise实例改为rejected状态
const p = new Promise((resolve, reject) => {
})
const t = p.then.((value) => {
console.log("成功")
//使用return可以将t实例的状态改为fulfilled
return 123
},(reason) => {
//如果这里代码出错,会将t实例的状态改为rejected
console.log("失败")
})
t.then.((value) => {
console.log("成功2",value)
},(reason) => {
console.log("失败2")
})
catch方法
const p = new Promise((resolve, reject) => {
//reject()
//console.log(a)
throw new Error("出错了");
})
//思考: catch中的参数函数在什么时候被执行
//1. 当Promise的状态改为rejcted.被执行
//2. 当Promise执行体重出现代码错误时,被执行
p.catch((reason => {
console.log("失败", reason)
})
console.log(p);
用Promise解决回调地狱问题
//封装ajax请求
function getData(url, data = {}){
return new Promise((resolve, reject) => {
$.ajax({
//发送请求类型
type: "GET",
url: url,
data: data,
success: function (res) {
// 修改Promise状态为成功, 修改Promise的结果res
resolve(res)
},
error:function (res) {
// 修改Promise的状态为失败,修改Promise的结果res
reject(res)
}
})
}
}
//调用函数
getData("data1.json")
.then((data) => {
//console.log(data)
const { id } = data
return getData("data2.json", {id})
})
.then((data) => {
//console.log(data)
const { usename } = data
return getData("data3.json", {usename})
})
.then((data) => {
console.log(data)
})
440

被折叠的 条评论
为什么被折叠?



