Async和Await

本文深入探讨了JavaScript中的async/await语法,如何使用它们来处理异步操作,并展示了如何利用这些特性解决回调地狱问题。通过实例解析了async函数的工作原理,包括返回Promise、错误处理和await的使用。此外,还展示了如何在异步请求中应用async/await来避免层层嵌套的回调函数,提高代码可读性和维护性。
摘要由CSDN通过智能技术生成

 async

    async是一个异步的函数

    let fn = async () => {
        console.log('后');
        return 123
    }
    console.log('先');
    fn().then(res => {
        console.log(res);
    })

可以作用在任何方法前, 返回值是一个Promise对象(回调函数也可以使用async)

 let fn = async () => {
        return
    }
    console.dir(fn());

   函数内部return的返回值, 会成为then回调函数的参数  

    let fn = async () => {
        return  123
    }
    console.dir(fn());

    fn().then(res => {
        console.log(res); //123
    })

 

   async作用的方法,如果内部出现报错,可以被promise的catch方法捕获(reject也可以

    let fn = async () => {
        throw new Error("报错")
        return 123
    }


    //fn().then(res => {
    //    console.log(res);
    //}err=>{
    //  console.log(err); //Error: 报错
    //})


    fn().then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    })

   常规使用,一般都会通过try catch进行有可能报错的代码处理(建议使用try catch进行有可能报错的代码处理因为await没reject

    let fn = async () => {
        try {
            const a = 1;
            a = 2
            return 1
        } catch (err) {
            console.log('try catch', err);
            return 2
        }
    }
    fn().then(res => {
        console.log(res) //2
    })

  

await

   await只能作用在async修饰的方法中,不能单独使用,如果使用报错

   await是会阻塞代码执行(从这里可以看出await是一个同步的操作,从上到下执行

    let fn1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(1)
            }, 1000);
        })
    }
    async function fn() {
        let res = await fn1();
        console.log("step2_1", res);
        console.log("step2_2")
    }
    fn();

   正常情况 await后面跟着一个Promise对象; 返回的是Promise对象的成功后结果; 如果是一个普通值,那么会直接返回这个值

    async function fn() {
        let res = await Promise.resolve("hello world");
        let res1 = await 'hello';
        console.log(res); //hello world
        console.log(res1);//hello
    }
    fn();

   reject的返回 await没有办法进行捕获(使用try catch进行捕获)

回调地狱

    回调地狱就是在异步js里,回调函数写的太多了,回调套回调。很难凭直觉看懂代码。

    setTimeout(function () {  //第一层
        console.log('hello');
        setTimeout(function () {  //第二程
            console.log('world');
            setTimeout(function () {   //第三层
                console.log('hello world');
            }, 3000)
        }, 2000)
    }, 1000)

   在平常代码中我们遇到回调地狱一般都是我们在数据请求的时候出现,我们需要上一个请求的一个值,才能进行下一个请求。

如:

    一个要求是请求地址,需要省、市、区 。我们就需要省的id,通过省的id请求某一个省里的市,在通过我们选的市的id去请求区。这样我们需要一个ajax异步请求的结果去请求下ajax异步就是一个回调地狱。

    let id = '选择的省id'
    $.ajax({
        type: "GET",
        url: "https://地区请求id?=" + id,
        success: function (res) {
            $.ajax({
                type: "GET",
                url: "https://地区请求?id=" + res.id,
                success: function (res) {
                    $.ajax({
                        type: "GET",
                        url: "https://地区请求?cid=" + res.cid,
                        success: function (res) {
                            this.list = res.data.data
                        },
                    })
                },
            })
        },
    })

Async、Await解决回调地狱

    let list = []
    let id = '选择的省id'
    let cid = '选择的市id'
    let province = function fn1(id) {
        return new Promise((resolve, reject) => {
            $.ajax({
                type: "GET",
                url: "https://地区请求?id=" + id,
                success: function (res) {
                    resolve(res.id)
                },
            })
        })
    }
    let city = function fn2(id) {
        return new Promise((resolve, reject) => {
            $.ajax({
                type: "GET",
                url: "https://地区请求?id=" + id,
                success: function (res) {
                    resolve(res.data.data)
                },
            })
        })
    }
    let area = function fn3(cid) {
        return new Promise((resolve, reject) => {
            $.ajax({
                type: "GET",
                url: "https://地区请求?cid=" + cid,
                success: function (res) {
                    resolve(res.id)
                },
            })
        })
    }
    let fn = async function () {
        let a = await province(id) // 传入用户选中的省的id
        list = await city(a)   //通过用户选中的省的id,获取该省所有的市
        let c = await area(cid)  //传入用户选中的选择的市id
    }
    fn()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值