第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

【九月打卡】第3天 前端工程師2022版

標(biāo)簽:
JavaScript

课程名称:await 函数用法

课程章节:await 的机制await 的值 和 await 的注意事项

课程讲师: Alex

课程内容:

1、 await 的机制

举个例子:

下面的代码是前面学习基础用到的广告代码

       .ad{
            display: block;
            width: 300px;
            height: 150px;
            margin: 0 auto;
        }
        .none{
            display: none;
        }
<img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="/ad.jpg" alt="前端体系课" class="ad none" id="ad">
    <script>
        // 先写一个等待函数
        function wait(ms){
            return new Promise(resolve => {
                setTimeout(resolve,ms);
            });
        }
        async function ad() {
            const adDom = document.getElementById('ad'); 
            
            await wait(1000);
            // 显示
            adDom.classList.remove('none');
            await wait(2000);
            // 隐藏
            adDom.classList.add('none'); 
        }
        ad();
        console.log('async外部函数的代码')
    </script>

上面的 await 部分 相当于

          wait(1000).then( ()=> {
              // 显示
              adDom.classList.remove('none');

              return wait(2000)
          }).then(()=> {
              // 隐藏
              adDom.classList.add('none'); 
          })

上面的广告和控制台打印,毫无疑问是先打印,再显示广告

由此我们可以得出结论:

① async 函数中的代码有先后关系,await 会阻塞该async 函数中代码的执行,async 函数外的代码不受影响

② async 函数内部是同步执行的,它本身是异步的


2、await 的值

依然是上面的代码

        // 先写一个等待函数
        function wait(ms){
            return new Promise(resolve => {
                setTimeout(resolve,ms);
            });
        }
        async function ad() {
            const adDom = document.getElementById('ad'); 
            
            //await wait(1000);
            console.log(await wait(1000));  //undefined
            adDom.classList.remove('none');
            await wait(2000);
            // 隐藏
            adDom.classList.add('none'); 
        }
        ad();

https://img1.sycdn.imooc.com//631899910001376510120412.jpg

这里返回的是 undefined,原因就是等待函数那里的

return new Promise(resolve => {
    setTimeout(resolve,ms);
});

相当于:

setTimeout(()=>{
    resolve(undefined)
},ms)

也就是说resolve默认传了个undefined,如果改成123,那么打印的的就是123

https://img1.sycdn.imooc.com//631899e80001cc0611370351.jpg

所以总结一下:

① 如果 await 后面是一个 Promise 对象,await 的值就是该 Promise 对象的结果(PromiseResult)

当后面不跟Promise时:

无论是什么,都直接打印 await 后面跟的值,因为await后面要跟异步操作,如果什么都没写,那就相当于在后面做了一个包装,而resolve后面的值本身就是直接返回出来的

async function fn(){
    // let result = await 123;
    let result = await [1,2,3];
    //相当于
    let result = await Promise.resolve([1,2,3]);
    console.log(result)  //[1,2,3]
}

② 如果await后面不是Promise对象,await的值就是该值,相当于包了一层Promise.resolve() 之后再获取该Promise对象的结果


3、await 的注意事项

function wait(ms,error){
            return new Promise((resolve,reject) => {
                setTimeout(()=>{
                    if(!error){
                        resolve()
                    }else{
                        reject(new Error(error))
                    }
                },ms);
            });
        }
        async function ad() {
            const adDom = document.getElementById('ad'); 
            
            // await wait(1000,'等1s失败了');
            // 显示
            adDom.classList.remove('none');
            await wait(2000,'等2s失败了');
            // 隐藏
            adDom.classList.add('none'); 
        }
        ad().then(()=>{
            console.log('success');
        });

https://img1.sycdn.imooc.com//6318b36800012ab610790375.jpg

https://img1.sycdn.imooc.com//6318b36800011c7510320328.jpg

https://img1.sycdn.imooc.com//6318b37a00014f7508020317.jpg

由图可知:

async 函数内部所有 await 后面的 Promise 对象都成功,async 函数返回的 Promise 对象才会成功;只要任何一个 await 后面的 Promise 对象失败,那么 async 函数返回的 Promise 对象就会失败  

 

* 可以通过 try...catch 或者 Promise...catch 的方式来处理错误

promise...catch

https://img1.sycdn.imooc.com//6318b3fb000137bb09810213.jpg

https://img1.sycdn.imooc.com//6318b3fb000184a811230468.jpg

https://img1.sycdn.imooc.com//6318b3fc0001be5f08120277.jpg

await 一般只能用在 async 函数中,async 函数中可以没有 await

有的浏览器也可以用在模块的最顶层,借用 await 解决模块异步加载的问题

课程收获:

老师讲的非常细致,通俗易懂。这一节学的是 await 函数的用法,通过学习我了解了什么是 await 函数的返回值、await 函数的机制以及 await函数的注意事项 。知道,await 只能用在 async 函数中,async 并不是一定要和 await 一起用,这是因为有的浏览器也可以用在模块的最顶层,借用 await 解决模块异步加载的问题

,期待明天的学习 




點擊查看更多內(nèi)容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消