以同步格式寫異步代碼 - await

用優雅的方式編寫異步代碼-Eric


前言

隨着互聯網的發展,js的應用越來越廣泛,地位也越來越重要,網站也發生了翻天覆地的變化。
到目前爲止,前後臺基本徹底分離,交互都採用異步的方式,ajax、fetch...


fetch

目前大部分互聯網公司開發都轉向React、Vue,前後臺交互也大都使用fetch取代ajax,而我們知道fetch的實現原理採用了es6中的Promise,Promise把異步請求變得簡單優雅,代碼示例:

fetch(url, {})
    .then(response=>{})
    .then(res=>{})
    .catch(err=>{});

我們要處理返回結果一般這麼寫:

fetch(url, {})
    .then(response=>{ return response.json() })
    .then(res=>{
        // 結果處理
        if(res.success){
            // somecode...
        }
    })
    .catch(err=>{});

如果處理邏輯比較多,這麼寫不直觀,能不能這麼寫呢:

let res = fetch(url, {});
// 結果處理
if(res.success){
    // somecode...
}

結果當然是可以的,那就是es7中的await


await & async

await 是es7中定義的一個關鍵字,可以等待Promise返回數據,相當於暫停功能,await字面意思就是等待。
async也是es7中的關鍵字,字面意思是異步,作用就是聲明一個異步方法。

注意:
1、await不能單獨存在,必須和async(異步)關鍵字一起使用。
2、await 後面如果不是一個Promise對象的話,那麼不會等待哦!

代碼走一波:

// async寫在方法前面
asyncFunc = async ()=>{

    console.time();

    let res = await (new Promise((resolve, reject)=>{
        setTimeout(resolve.bind(this, 10), 2000);
    }));

    console.timeEnd(); // default: 2711.656982421875ms  等待Promise執行完畢

    console.log( res ); // 10  拿到了Promise的返回結果
}

asyncFunc();

await 對普通異步代碼無效:

asyncFunc2 = async ()=>{

    console.time();

    let res = await setTimeout( ()=>{return 10}, 2000);

    console.timeEnd(); // default: 0.705078125ms, 說明沒有等待setTimeout完成

    console.log( res ); // 737 setTimeout定時器的返回值
}

asyncFunc2();

更多操作自己去實踐吧!


擴展

有興趣的小夥伴可以去研究下 yield 關鍵字哦, 可以暫停方法的執行,並返回yield 後面的值

喜歡我的文章就點贊轉發吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章