• ES6的异步,promise,async和await了解


    目录

    promise

    async 和 await


     

    promise

    • 为了解决回调地狱的问题 es6给我们提供了一种方案——promise

      • es6给我们提供了一个构造函数——Promise

      • 用法:

          1. //promise使用方式
          2. //1.使用Promise构造函数 实例化对象
          3. let p = new Promise((res,rej)=>{
          4.    //res:成功态函数
          5.    //rej:失败态函数
          6.    //promise的实例对象 存在三种状态 默认状态为 等待态 如果调用res函数就会转变为成功态 调用rej函数 转变为失败态
          7.    //注意:promise实例对象 只能转变一次状态
          8.    res(成功态结果数据);//转变为成功态
          9.    rej(失败态结果数据);//转变为失败态
          10. })
          11. //2.promise对象 可以调用两个方法——then catch
          12. //then方法 是成功态promise对象调用的方法
          13. p.then((data)=>{
          14.    //形参data将会接收到 成功态的结果
          15. })
          16. //catch方法 是失败态promise对象调用的方法
          17. p.catch((err)=>{
          18.    //形参err将会接收到 失败态的结果
          19. })

        • 一般我们在使用promise的时候 都会 在Promise构造函数中 写入异步代码(定时器、事件等) 这样就可以避免回调函数的嵌套

        • 例如:

            1. //需求:延迟两秒 打印 成功了
            2. let p = new Promise((res,rej)=>{
            3.    setTimeout(()=>{
            4.        res("成功了");
            5.   },2000)
            6. })
            7. //2.promise实例对象调用then(成功态) 和 catch(失败态)方法
            8. p.then((data)=>{
            9.    console.log(data);
            10. })
            11. //promise执行顺序
            12. /*
            13. 1.调用Promise构造函数 创建promise对象
            14. 2.等待Promise构造函数中的回调函数里的异步代码执行
            15. 3.异步代码执行之后 就会对应的改变promise对象的状态
            16. 4.状态改变完之后 才会对应调用then 或 catch方法
            17. */

        • promise的then和catch方法 可以链式调用

          • then和catch的链式调用

            1. let salary = 10001
            2. let p = new Promise((res,rej)=>{
            3.    if(salary>10000){
            4.        res("成功了");
            5.   }else{
            6.        rej("失败了")
            7.   }
            8. })
            9. p.then((data)=>{
            10.    console.log(data);
            11. }).catch((err)=>{
            12.    console.log(err);
            13. })

          • then和then也可以链式调用

            1. let salary = 10001
            2. let p = new Promise((res,rej)=>{
            3.    if(salary>10000){
            4.        res("成功了");
            5.   }else{
            6.        rej("失败了")
            7.   }
            8. })
            9. p.then((data)=>{
            10.    console.log(data);
            11.    return 数据
            12. }).then((data)=>{
            13.    //data中接收到的是 上一个then方法 的 回调函数中的返回值
            14.    console.log(data);
            15. })...

        • 总结:

          • then和catch方法 之所以可以链式调用 是因为 这两个方法 的 返回值 是 promise对象

          • 注意:then方法的链式调用 除了第一个then方法 中回调函数可以接收到成功态数据之外 其他then方法中回调函数 接收到的数据 都是上一个then方法回调函数的返回值

      • promise解决回调地狱问题

          1. //解决回调地狱
          2. //promise解决问题
          3. let fn = () => {
          4.    //在函数中 我们生成promise对象 并将promise对象返回出去
          5.    let p = new Promise((res, rej) => {
          6.        setTimeout(() => {
          7.            res("aaa")
          8.       }, 2000)
          9.   })
          10.    return p;
          11. }
          12. //下面我们使用promise的写法 来实现上述效果
          13. let fn1 = (data)=>{
          14.    console.log(data);
          15.    return fn();//返回的是fn() promise对象 如果上一个then方法的回调函数中 返回的是promise对象 下一个then方法的回调函数中 接收到的就是 前面返回的promise对象的成功态数据
          16. }
          17. fn().then(fn1).then(fn1).then(fn1).then(fn1).then(fn1).then(fn1)

      • promise的合并

        • 在promise的使用过程中 我们可以将多个promise对象 合并为一个
          使用的方法是Promise.all
          用法:let 变量 = Promise.all([promise对象1,对象2,对象3,...])
          ​
          合并出来的promise对象 也可以正常调用 then 和 catach 方法
          ​
          如果所有合并的promise对象状态都是成功态 则 调用then方法 接收到的结果是一个数组 数组中包含所有promise对象的成功态数据
          ​
          如果所有合并的promise对象有一个状态为失败态 则 调用catch方法 接收到失败态数据
          ​
          如果有多个promise为失败态 则 调用catch方法 接收第一个出现失败态的promise对象的失败态数据 后面的失败态promise对象就不管了

    async 和 await

    •  promise并没有从根本上解决 回调函数的写法

    • 为了进一步的优化 在es8中 提出了 async和await修饰符 来解决回调地狱问题

    • 基础用法:

      • async:是一个函数修饰符 专门用来修饰函数 使用async修饰过的函数 函数体中 才能使用await

          1. //普通函数
          2. async function 函数名(){}
          3. //声明变量的函数
          4. let 变量名 = async ()=>{}
          5. //方法函数
          6. {
          7.    async fn(){
          8.        
          9.   }
          10. }
          11. //事件处理函数
          12. 元素.onclick = async function(){}
          13. //箭头函数
          14. async ()=>{}
          15. //匿名函数
          16. (async function(){})

      • await:是一个关键字 这个关键字 只能用在 被async修饰过的函数体内部

        • await也是一个修饰符 理论上讲 可以修饰任何数据 但我们一般用await 修饰promise对象

          1. async function 函数名(){
          2.    let 变量 = await promise对象;
          3. }

        • 当我们使用await修饰promise对象的时候 await会自动接收到 promise对象的成功态数据(不需要单独调用then)

        • 注意:在async修饰的函数中 我们每遇到一个await 就会等待其后的promise对象的状态发生变化 状态变为成功态之后 接收数据 继续向下执行

          1. async function 函数名(){
          2.    let 变量1 = await promise对象;//遇到await 就等待其后的promise对象改状态
          3. console.log(变量1)//执行
          4.    let 变量2 = await promise对象;//再次遇到await 再等待promise对象改状态
          5.    console.log(变量2)//执行
          6.    let 变量3 = await promise对象;//再次遇到await 再等待promise对象改状态
          7.    console.log(变量3)//执行
          8.    ...
          9. }

        • async-await解决回调地狱问题

            1. //1.封装一个用来创建promise对象的函数 异步代码写在promise构造函数的回调里面
            2. let fn = () => {
            3.    let p = new Promise((res, rej) => {
            4.        setTimeout(() => {
            5.            res("aaa")
            6.       }, 2000)
            7.   })
            8.    return p
            9. }
            10. //2.编写async修饰的函数 并在函数内部 通过await 接收promise对象的成功态数据
            11. let fn1 = async () => {
            12.    for (let i = 0; i < 6; i++) {
            13.        console.log(await fn());
            14.   }
            15. }
            16. fn1()

    • 使用await的函数 必须 用 async修饰

    • 没遇到一次 await 就会 等待一次

     

  • 相关阅读:
    php 获取音频时长等信息
    MIT课程分布式系统学习01——Introduction
    Day1 ARM基础
    AprilTags论文翻译
    可观测性-Metrics-统计每个指标的基数
    《Python Cookbook》第三版——读书笔记
    抖音矩阵系统,抖音矩阵系统,抖音矩阵系统。
    TKMybatis的使用大全和例子(example、Criteria、and、or)
    带你吃透Servlet核心编程下篇(完整图文教程)
    100道面试必会算法-反转链表-02
  • 原文地址:https://blog.csdn.net/weixin_64037609/article/details/127438613