• js使用ES6 Promise和ES7 async await 解决地狱回调问题


    之前我们使用的地狱回调方法

    // 我们这时用同步的思想嵌套来实现有顺序的输出,可是我们顾虑的就多了
    // 会出现代码污染以及报错后面代码无法执行的问题
    getData("./files/1.txt", function(data) {
        console.log("请求成功,这是", data);
        getData("./files/2.txt", function(data) {
            console.log("请求成功,这是", data);
            getData("./files/3.txt", function(data) {
                console.log("请求成功,这是", data);
            });
        });
    });

    为什么之前要使用地狱回调?

    因为我们要在异步请求结束之后,执行别的请求接口,所以形成了嵌套地狱回调的形式

    解决办法

    1、ES6 Promise 解决地狱回调

    // 实例化Promise
    function getData(path,params) {
        // 直接return Promise实例化方法,就可以调用.then 方法, .then 是promise对象的一个属性
        return new Promise(function(resolve, reject) {
            $.ajax({
              url:path,
              data: params,
              type:'get',
              success:function(res){
                resolve(res);
              },
              error:function(err){
                reject(err)
              }
            })
        });
      }
      
      
      getData("/home/swiperdata").then(function(data) {
        console.log(data)
            // 此时必须再返回一个promise构造函数的实例,这样才能继续用.then
            // .then 是promise对象的一个属性
        return getData("/home/catitems");
        // 如果报错,可以继续执行后面的代码
      }).then(function(data) {
        console.log(data);
        return getData("/home/floordata");
      }).then(function(data) {
        console.log('地狱回调结束')
      });

    打印结果:

    2、使用SE7 async await 解决地狱回到

    // 实例化Promise
    function getData(path, params) {
        // 直接return Promise实例化方法,就可以调用.then 方法, .then 是promise对象的一个属性
        return new Promise(function (resolve, reject) {
            $.ajax({
                url: path,
                data: params,
                type: 'get',
                success: function (res) {
                    resolve(res);
                },
                error: function (err) {
                    reject(err)
                }
            })
        });
    }
    
    //  await 关键字 只能放在 async 函数内部, await关键字的作用 就是获取 Promise中返回的内容, 获取的是Promise函数中resolve或者reject的值
    //  如果await 后面并不是一个Promise的返回值,则会按照同步程序返回值处理,为undefined
    async function data() {
        //  await(异步等待):在异步方法中执行到这一步进行同步操作,等待异步请求结束再往下执行
        const res = await getData("https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata");
    
        // 这里直接使用 jq 的ajax 也是可以的,因为 jq的ajax使用的也是Promise
        const res1 = await $.ajax({
            url: 'https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata',
            type: 'get',
        })
    
        console.log(res);
        console.log(res1);
        console.log(111111);
    }
    
    data();

    打印结果:数据响应数据

     

  • 相关阅读:
    为什么qt成为c++界面编程的第一选择 老夏课堂
    升级 package.json 内所有包的版本号
    小米 pro 双硬盘设置引导盘
    react 疑问集锦
    jmeter 基础使用
    vmware ubuntu 看不到网卡或连接不到网络
    如何在 Windows 11 使用旧的(或完整的)右键菜单
    hbuilder x 连接夜神模拟器
    当初为什么报 软件工程 这个专业?
    sparky 一个趋势图的JavaScript插件
  • 原文地址:https://www.cnblogs.com/liangziaha/p/15309870.html
Copyright © 2020-2023  润新知