了解 JavaScript ES7 的 async / await

----歡迎查看我的博客----

async/await

??最近公司面試,發(fā)現(xiàn)有個別的朋友搞不明白 async , await ,甚至以為這個東西是 es6 的,雖然它和 es6 的 promise 確實有血緣關系,但這個東西確實是 es7 的。好了,廢話不多說,讓我們今天徹底看看這個玩意是什么吧。

async

??async 其實字面好理解 異步,await從字面意思也好理解,等待。所以看出來他們相輔相成,所以 await 只能出現(xiàn)在 async 函數(shù)中。 讓我們來寫段代碼看看

async function asyncTest(){
    return 'hello';
};

console.log(asyncTest()); //Promise {<resolved>: "hello"}

??我們看出來async返回的是一個 promise 對象,不太熟悉 promise 對象的童鞋,請看 上一篇文章 ,那既然是個promise對象,我們的所有promise的方法是不是可以調(diào)用了。讓我來看一下。

async function test(){
    return '我被觸發(fā)了';
};

test().then((val)=>{ console.log(val) }) //我被觸發(fā)了

竟然他return一個值那,又是promise對象,那我們是不是可以理解為就是 promise.resolve() 呢,讓我們來改寫一下:

    const promise = new Promise((resolve)=>{
        resolve('我被觸發(fā)了')
    });
    promise.then((val)=>{
        console.log(val) //我被觸發(fā)了。
    });

好的,沒毛病。** 在沒有 await 的情況下執(zhí)行 async 函數(shù),它會立即執(zhí)行,返回一個 Promise 對象,并且,絕不會阻塞后面的語句。這和普通返回 Promise 對象的函數(shù)沒區(qū)別 **

await

??好了我們。大概知道了 async 的寫法,那么我們來看看 await 。之前說到 await 只能出現(xiàn)在 async 的方法中,那我們來看看不出現(xiàn)會怎么樣?

    function test(){
        return 1
    };
    
    function result(){
        const val = await test()
        console.log(val) //await is only valid in async function
    }
    result();

很明顯報錯了。再次驗證 await 只能用在 async 的方法中。
改:

    function test(){
        return 1
    };
    
    async function result(){
        const val = await test()
        console.log(val) //1
    }
    result();

我們在來做些改變:

    function test(){
        return Promise.resolve(1)
    };
    
    async function result(){
        const val = await test()
        console.log(val) //1
    }
    result();

看來我們await調(diào)用外部的promise也沒問題,結(jié)合之前的,我們是不是可以這樣寫:

    async function test(){
        return 1
    };
    async function result (){
        const val = await test();
        console.log(val) //1
    }
    result()

兩者結(jié)合

??我們已經(jīng)在上面引出了兩者結(jié)合,但是anysc顧名思義,異步,好我們看看兩者結(jié)合怎么來處理異步問題吧。

    function test(){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve('我出來了')
            },1000)
        })
    };
    
    async function result(){
        const val = await test();
        console.log(val) //我出來了
    };
    result();

我們可以看出,test返回一個promise的對象,然后result里的await拿到了這個值。我們看看如果用.then怎么寫吧

    function test(){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve('我出來了')
            },1000)
        })
    }
    
    test().then((val)=>{
        console.log(val) //我出來了
    })

那既然.then可以解決問題那么問啥要用async和await呢?原因很簡單,多個鏈式調(diào)用。
例如我們有這樣的需求:

    function test1(val){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve(val + 1)
            },1000)
        })
    }
    function test2(val){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve(val + 1)
            },1000)
        })
    }
    function test3(val){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve(val + 1)
            },1000)
        })
    }
    
    function doit(){
        test1(1)
        .then((v)=>test2(v))
        .then((v)=>test3(v))
        .then((v)=>{console.log(v)}) //4
    }
    doit()

.then.then.then看著繁瑣且不易維護。我們來看看用新武器怎么解決的吧

    function test1(val){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve(val + 1)
            },1000)
        })
    }
    function test2(val){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve(val + 1)
            },1000)
        })
    }
    function test3(val){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                resolve(val + 1)
            },1000)
        })
    }
    
    async function doit(){
        const v1 = await test1(1);
        const v2 = await test2(v1);
        const v3 = await test2(v2);
        console.log(v3) //4
    }
    
    doit();
    

是不是更加靈活了?數(shù)據(jù)的解耦非常舒服,所以一個東西得誕生一定有原因的。

結(jié)語

關于 async , await 暫時說到這里。困了,好累啊。。。睡了晚安各位

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容