需求
通过AJAX请求id ,再根据id请求用户名.再根据用户名,再根据用户名获取email
回调地狱
回调函数中嵌套回调,Promise的出现主要解决了回调地狱。
一个构造函数,然后参数是一个函数,函数中有两个行参,resolve, reject
new Promise(( resolve, reject ) =>{})
Promise实例
promise实例有两个属性
通过调用resolve()和reject() 改变当前promise对象的状态
// 示例1
const p = new Promise((resolve, reject) => {// resolve(): 调用函数, 使当前Promise对象的状态改成fulfilledresolve();
})
console.dir(p) // fulfilled
// 示例2
const p = new Promise((resolve, reject) => {// resolve(): 调用函数, 使当前Promise对象的状态改成fulfilled// reject(): 调用函数, 使当前Promise对象的状态改成rejected// resolve();reject()
})
console.dir(p)
Promise状态的改变是一次性的!
// 示例
const p = new Promise((resolve, reject) => {// 通过调用 resolve,传递参数,改变 当前Promise对象的结果resolve("成功的结果");// resolve();// reject("失败的结果")
})
console.dir(p)
实例1
const p = new Promise((resolve, reject) => {// 通过调用 resolve,传递参数,改变 当前Promise对象的结果// resolve("成功的结果");reject("失败的结果")
})// .then方法包含两个参数,两个参数都是函数,一个成功时执行,一个失败时执行
// 返回值: 是一个Promise对象
p.then(()=>{// 当Promise的状态使fulfilled时执行console.log("成功的回调")
},()=>{// 当Promise的状态时rejected时, 执行console.log("失败时调用")
})
console.dir(p)
实例2
const p = new Promise((resolve, reject) => {// 通过调用 resolve,传递参数,改变 当前Promise对象的结果// resolve(123);reject("失败的结果")
})//then方法函数
// - 参数
// 两个参数都是函数
// 返回值: 是一个Promise对象
p.then((value)=>{//当Promise的状态使fulfilled时执行console.log("成功的回调",value)
},(err)=>{// 当Promise的状态时rejected时, 执行console.log("失败时调用",err)
})
console.dir(p)
then方法返回一个新的Promise实例,状态是pending
在then方法中,通过return将返回的Promise实例改为fulfilled状态
// 如果Promise的状态不改变,then里的方法不会执行
const p = new Promise((resolve, reject) => {resolve()
})
const t = p.then((value) => {console.log("成功")// 使用return可以将t实例的状态改为fulfilledreturn 123
},(reason) => {
console.log("失败")
})
t.then.((value) => {console.log("成功2",value)
},(reason) => {
console.log("失败2")
})
在then方法中,出现代码错误,将返回的Promise实例改为rejected状态
// 如果Promise的状态不改变,then里的方法不会执行
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")
})
实例:
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
手写promise
笔记
promise-阮一峰