1.Promise_语法学习
目标
-
掌握Promise相关语法使用
讲解
-
Promise在设计之初, 就是为了解决回调地狱
-
新建html文件, 来熟悉下Promise的相关语法
// 语法:
/*
let Promise对象变量名 = new Promise((resolve, reject) => {
// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面
resolve(成功结果) // 触发.then()小括号里函数体执行
reject(失败结果) // 触发.catch()小括号里函数体执行
})
Promise对象变量名.then((成功结果变量名) => {
}).catch((失败结果变量名) => {
})
*/
let p = new Promise((resolve, reject) => {
// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面
// resolve('成功了')
reject('失败了')
})
p.then(res => {
console.log(res)
}).catch(err => {
console.error(err)
})
2.Promise_配合异步
目标
-
掌握用Promise来管理异步代码
讲解
-
新建
10.Promise_配合异步.html
来使用Promise包裹一个异步任务代码, 来看看效果
// 例1 配合定时器使用
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功结果')
}, 2000)
})
p.then(res => {
console.log(res); // 2秒后返回'成功结果'
})
3.Promise_三种状态
目标
-
了解Promise的三种状态
讲解
-
新建
11.Promise_三种状态.html
来讲解, 在上个代码的例子来说明为何代码会这样执行
// 1. 创建Promise对象并返回此对象在原地, 并立刻执行函数内代码, 交给浏览器去做倒计时了(异步, 不会阻塞主线程代码往下走, 所以继续走2)
let p = new Promise((resolve, reject) => {
setTimeout(() => {
// 3. 等2秒后, resolve触发, 影响p对象状态
resolve('成功结果') // resolve => fulfilled状态 => .then
reject('失败结果') // reject => rejected状态 => .catch
}, 2000)
})
// 2. 立刻给p对象添加.then函数并传入函数体等待被调用接收成功结果(此是.then()小括号里函数体不会执行)
p.then(res => {
console.log(res); // 2秒后返回'成功结果'
}).catch(err => {
console.error(err)
})
// 总结: 每个Promise对象有状态凝固特性, 就是Promise对象确定是成功/失败, 就不能再备更改了
2.所以Promise有三种状态
-
new实例化后, Promise对象(pending准备状态) -> 也是在原地给个承诺
-
当Promise内代码执行了resolve, 会导致所在的Promise对象(fulfilled成功状态) -> 兑现状态 -> 把值传给then
-
当Promise内代码执行了reject, 会导致所在的Promise对象(rejected失败状态) -> 拒绝状态 -> 把失败值传给catch
4.Promise_链式调用
目标
-
掌握Promise的链式调用
讲解
-
编写代码进行讲解
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功1')
}, 2000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功2')
}, 2000)
})
p.then(res => {
console.log(res);
return p2 // 如果return一个Promise对象,它的结果, 会被下个then接收
}).then(res => {
console.log(res);
})
5.Promise_解决回调地狱
目标
-
使用Promise来解决回调地狱
// 目标: 使用Promise的链式调用解决问题 // 前提: axios函数在原地返回的就是一个Promise对象 let pname = '' axios.get('http://ajax-api.itheima.net/api/province').then(res => { // 2. 获取某个省, 对应的城市列表 pname = res.data.data[5]; return axios.get(`http://ajax-api.itheima.net/api/city?pname=${pname}`) }).then(res => { // 3. 获取某个市, 对应的地区列表 let cname = res.data.data[0] return axios.get(`http://ajax-api.itheima.net/api/area?pname=${pname}&cname=${cname}`) }).then(res => { console.log(res); })
讲解
-
新建html文件, 用axios方法原地返回Promise对象特性
-
用.then()里return Promise对象结果会被链式调用下一个then接收特性
6.Promise的静态方法_all
目标
-
能说出Promise.all方法的作用
讲解
-
讲解Promise的all方法
// 目标: 讲解Promise的all方法
// 静态(类)方法: 直接用Promise类来调用
// 1. Promise.all()
// 作用: 合并多个Promise对象, 等待所有成功后, 返回结果
// 语法: Promise.all([promise对象1, promise对象2, ...]).then()
// 特点: 返回最终结果是个数组, 值是按顺序对应小Promise对象的成功结果
// 注意: 如果有1个Promise失败, 则整个Promise对象则失败
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功1')
}, 2000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功2')
}, 2000)
})
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功3')
}, 2000)
})
Promise.all([p1, p2, p3]).then(res => {
console.log(res);
})
7.Promise的静态方法_race
目标
-
能说出Promise.race方法的作用
讲解
-
讲解Promise的race方法
// 目标: 讲解Promise的race方法
// 静态(类)方法: 直接用Promise类来调用
// 1. Promise.race() - 赛跑机制
// 作用: 发起并行多个Promise对象, 等待只要任何一个成功, 返回结果执行then
// 语法: Promise.race([promise对象1, promise对象2, ...]).then()
// 特点: 返回某个promise对象成功的结果
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功1')
}, 2000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功2')
}, 2000)
})
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功3')
}, 2000)
})
Promise.race([p1, p2, p3]).then(res => {
console.log(res);
})
7.Promise的静态方法resolve和reject
目标
-
能说出Promise的静态方法resolve和reject方法作用
讲解
-
了解Promise的resolve和reject方法即可
// 目标: 讲解Promise静态方法的resolve和reject
// 1. 先看如下效果, 封装求2个数的和函数
function sumFn(numA, numB) {
if (numA && numB) {
return numA + numB
} else {
return '请传递参数'
}
}
let result1 = sumFn(10, 20)
let result2 = sumFn()
// 返回的结果要么是和要么是字符串, 不太方便判断是否成功/失败
// 2. 所以这个时候, 我们可以用Promise的静态方法, 把结果包装成Promise对象
// 3. Promise.resolve()
// 作用: 把现有的值包装成成功状态的Promise对象并返回
// 返回值: 一个成功状态的Promise对象和结果
function myFn(numA, numB) {
if (numA && numB) {
return Promise.resolve(numA + numB) // 现在返回的Promise对象
} else {
return '报错'
}
}
myFn(10, 20).then(res => {
console.log(res);
})
// 但是myFn().then() 这样写会报错, 因为返回的字符串无法调用then
// 解决, 也得把错误提示字符串包装成Promise对象
// 4. Promise.reject()
// 作用: 把现有的值包装成失败状态的Promise对象并返回
// 返回值: 一个失败状态的Promise对象和结果
function theFn(numA, numB) {
if (numA && numB) {
return Promise.resolve(numA + numB) // 现在返回的Promise对象
} else {
return Promise.reject('报错')
}
}
theFn().then(res => {
console.log(res);
}).catch(err => {
console.error(err);
})
// 一般在封装库的时候常用, 所以了解其作用即可