Promise

1.Promise_语法学习

目标

  • 掌握Promise相关语法使用

讲解

  1. Promise在设计之初, 就是为了解决回调地狱

  2. 新建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来管理异步代码

讲解

  1. 新建10.Promise_配合异步.html来使用Promise包裹一个异步任务代码, 来看看效果

// 例1 配合定时器使用
let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('成功结果')
    }, 2000)
})

p.then(res => {
    console.log(res); // 2秒后返回'成功结果'
})

 

3.Promise_三种状态

目标

  • 了解Promise的三种状态

讲解

  1. 新建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的链式调用

讲解

  1. 编写代码进行讲解

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);
    })

讲解

  1. 新建html文件, 用axios方法原地返回Promise对象特性

  2. 用.then()里return Promise对象结果会被链式调用下一个then接收特性

6.Promise的静态方法_all

目标

  • 能说出Promise.all方法的作用

讲解

  1. 讲解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方法的作用

讲解

  1. 讲解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方法作用

讲解

  1. 了解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);
})

// 一般在封装库的时候常用, 所以了解其作用即可

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值