async函数

1.什么是async函数

	<script>
        async function foo() {
            return 123
        }
        let res = foo()
        console.log(res); // promise
        res.then(res => {
            console.log(res);  // 123
        })
        let foo1 = async function () { }
        let foo2 = async () => { }
        let obj = {
            foo: async function () { },
            foo1: async () => { },
            // function 函数;es6 中新写法  仅仅为对象中函数
            async foo3() { }
        }
        // 以上为所有async 函数的写法
    </script>

2.为什么会有async 函数

1: promise .then 太多了。也容易乱
2:做不到好好管理代码
所以有 async awiat 函数

异步编写代码 进步的过程
回调函数编写---->promise ---->generater 函数 ----->async await

 	async function foo() {
        console.log('111');
        return 123
    }

1: async 函数的返回值 是 promise

   let res = foo();
   console.log('22222');

2: 如何接收return 的 123 ?

		let cb = (data) => {
            console.log('333');
            console.log('接收了 async 的return', data);
        }

        // 方式1

        res.then(cb)

        // 方式2 

        let cb1 = async () => {
            let res = await foo();
            console.log('5555');
            console.log('awiait', res);
        }
        cb1();
        console.log('44444');

1: await 函数执行
2: await promise实例
3: await 只能在 async 函数中编写

async await 是异步程序

问题:async await 到底谁是执行慢的程序???

  • async 方法体中代码 同步执行
  • await 是异步执行,有阻塞行为
  • 在同一个 async 函数中。await 可以阻止下面代码执行,
    需要等一个 await 执行完毕后;执行下一个await,以及下一行代码
	function promise1() {
        return new Promise((resolve, reject) => {
            console.log('异步任务一 开始');
            setTimeout(() => {
                console.log('任务一 有结果了');
                resolve('success 1')
            }, 1000);
        })
    }

    function promise2() {
        return new Promise((resolve, reject) => {
            console.log('异步任务二 开始');
            setTimeout(() => {
                console.log('任务二 有结果了');
                resolve('success 2')
            }, 2000);
        })
    }

    function promise3() {
        return new Promise((resolve, reject) => {
            console.log('异步任务三 开始');
            setTimeout(() => {
                console.log('任务三 有结果了');
                resolve('success 3')
            }, 2000);
        })
    }
    // 用下面写法代替了上面的写法  then.then.then 
    async function listen() {
        let res1 = await promise1();
        console.log('----------------分解线-----------------');
        console.log(res1);
        console.log('----------------end-----------------');

        let res2 = await promise2();
        console.log('----------------分解线-----------------');
        console.log(res2);
        console.log('----------------end-----------------');

        let res3 = await promise3();
        console.log('----------------分解线-----------------');
        console.log(res3);
        console.log('----------------end-----------------');
    }

    listen()

3.async和await

	<!-- 
        1 async是同步代码
        2 await 异步的 有阻塞的作用
        3 await 不执行完毕 下面的代码也不会执行

        难点:await 返回值
        情况一 :await 普通函数执行
        ->返回值就是函数的return值
        情况二 :await async函数执行
        ->返回值就是asyncreturn值
        情况三 :await promise实例 
        //关键看promise 是怎么创建的  如果是new Promise 那么就是1,如果是then那么就是2
        ->1 resolve 的实参
        ->2 then 的 return-->
    <script>
        // 异步程序 同步化做好的方式
        (async function(){
            console.log('___________start__________');

            let res1 =await promise1();  //情况三
            console.log(res1);
            let res2 = await promise2()  //情况三
            console.log(res2);
            let res4 = await a();        //情况一
            console.log(res4);  //123
            let res5 = await new Promise((resolve,reject)=>{
                resolve('success 5')
            })
            console.log(res5); 
            let res6 = await (new Promise((resolve,reject)=>{
                resolve('success 6')
            })).then(res => '啊哈哈哈')
            console.log(res6); 
            console.log('___________end__________');
        })()
        function promise1() {
            return new Promise((resolve, reject) => {
                console.log('异步任务一 开始');
                setTimeout(() => {
                    console.log('任务一 有结果了');
                    resolve('success 1')
                }, 1000);
            })
        }

        function a(){
            return 123
        }

        function promise2() {
            return new Promise((resolve, reject) => {
                console.log('异步任务二 开始');
                setTimeout(() => {
                    console.log('任务二 有结果了');
                    resolve('success 2')
                }, 2000);
            })
        }
    </script>

4.捕获错误

		(async function () {
            try {
                let res1 = await promise2();
                console.log(res1);
                let res = await promise1();
                console.log(res);
            } catch (err) {
                //这捕获await 在多个异步中;任意一个出现的错误
                //多个异步中;有一个出现错误其他的都不执行了
                console.log(err);
            }
        })()

        function promise1() {
            return new Promise((resolve, reject) => {
                console.log('异步任务一 开始');
                setTimeout(() => {
                    console.log('任务一 有结果了');
                    resolve('success one')
                }, 1000);
            })
        }

        function promise2() {
            return new Promise((resolve, reject) => {
                console.log('异步任务二 开始');
                setTimeout(() => {
                    console.log('任务二 有结果了');
                    reject('error 2')
                }, 2000);
            })
        }

5.async await练习

<script>
    let btn = document.querySelector('button')
    let text = document.querySelector('h1')

    btn.addEventListener("click", async function (params) {
        // let test = [ajaxA(), ajaxB(), ajaxC()]
        // let teststr = ''
        // let res = await Promise.all(test)
        // res.forEach(item => {
        //         item = JSON.parse(item);
        //         teststr = teststr + item.msg
        //     })
        // text.innerHTML = teststr;


        let a = await ajax('/a');
        let b = await ajax("/b");
        let C = await ajax("/c");
        a = JSON.parse(a);
        b = JSON.parse(b);
        c = JSON.parse(c)
        console.log(a, b, c);
        text.innerHTML = a.msg + b.msg + C.msg

    })

    function ajaxA() {
        return ajax('/a')
    }

    function ajaxB() {
        return ajax('/b')
    }

    function ajaxC() {
        return ajax('/c')
    }

    function ajax(url) {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', `http://192.168.1.149:3000${url}`);
            xhr.onreadystatechange = function () {
                if (xhr.readyState != 4) {
                    return
                }
                if (xhr.status === 200) {
                    resolve(xhr.responseText)
                } else {
                    reject(` error ${xhr} `)
                }
            }
            xhr.send()
        })
    }
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值