async-await 看這一篇就夠了

1. 前言

  1. 首先說明 async/await語法 屬于ES7,不過到現(xiàn)在就算是es6也還算是新技術(shù)吧,技術(shù)迭代比較慢
  2. 其實這個 async/await也是一種語法糖

2. 是什么 what

  1. async/await語法 通常結(jié)合promise使用
  2. 也就是說也是用同步的方式來寫異步代碼
  3. async 是異步的意思 用來聲明一個 function是異步的
  4. await 是 async wait 異步等待 ,就是等待一個異步函數(shù)執(zhí)行完成
  5. 規(guī)定await只能出現(xiàn)在async函數(shù)中


3. async 基礎(chǔ)

3.0 準備工作

function testAsy() {
            "hello  asy"
        }
const result = testAsy()
console.log("result:",result);
  1. 正常函數(shù) 不寫返回值 結(jié)果是 undefined
  2. 運行結(jié)果
    結(jié)果.png

3.1 async -無返回值

async function testAsy() {
        "hello  asy";
      }
      const result = testAsy();
      console.log("result:", result);
  1. 返回結(jié)果變?yōu)? 空Promise, 證明async會把函數(shù)結(jié)果變?yōu)?code>Promise
  2. 運行結(jié)果
    結(jié)果.png

  1. 既然是pomise了那resolve的結(jié)果是啥呢
      async function testAsy() {
        "hello  asy";
      }
    //   const result = testAsy();
    //   console.log("result:", result);
    testAsy().then(res=>{console.log("-----------------1",res)})
  1. 運行結(jié)果 undefined
    1.png
  2. async 修飾的函數(shù) 是異步函數(shù)
  3. async內(nèi)部給函數(shù)包了一層Promise.resolve()

3.2 async - 有返回值

       async function testAsy() {
       return  "hello  asy";
      }
    testAsy().then(res=>{console.log("-----------------1",res)})
  1. 函數(shù)的返回值是任何數(shù)據(jù)(數(shù)組,對象),則得到一個非空的promise 對象,resolve數(shù)據(jù)是返回的數(shù)據(jù)
  2. 運行結(jié)果
    結(jié)果.png

3.3 async- 返回 Promise

      async function testAsy() {
        return new Promise((resolve) => {
          resolve("玩唄");
        });
      }
      testAsy().then((res) => {
        console.log("-----------------1", res);
      });
  1. 直接得到返回值
  2. 運行結(jié)果
    結(jié)果.png

3.4 總結(jié)

  1. async函數(shù)的返回值總是一個promise對象, 有以下三種情況
  2. 如果沒有寫返回值, 則得到一個空的promise對象, resolve數(shù)據(jù)是 undefined,
  3. 如果返回值是數(shù)據(jù),則得到一個非空的peomise對象, resolve數(shù)據(jù)是返回的數(shù)據(jù),


4. reject實現(xiàn)

  1. 既然有resolve 那肯定也有 reject

4.1 代碼

async function testAsy(flag) {
            if(flag){
                return "hello  asy"
            }else{
                throw '拋出異常'
            }
        }
 console.log(testAsy(true));//Promise.resolve()
console.log(testAsy(false));//Promise.reject()

4.2 結(jié)果

結(jié)果.png

5. catch

5.1 代碼

 async function testAsy(flag) {
            if(flag){
                return "hello  asy"
            }else{
                throw '拋出異常'
            }
        }
        testAsy(false).then(res=>{
            console.log("Res:",res);
        }).catch(err=>{
            console.log("捕獲錯誤:",err);
        })

5.2 結(jié)果

1.png

還是通過 promise的 catch來進行錯誤捕獲


6. await catch

6.0 await

  1. await放在一個Promise對象前,
    會等待Promise異步結(jié)果,
    然后以返回值的形式拿到異步結(jié)果,
    使異步結(jié)果更簡單方便的獲取,
  1. 避免了回調(diào)的嵌套結(jié)構(gòu),
  2. 省略了then函數(shù)調(diào)用
  3. 后面可以跟任何表達式

6.1 為什么await可以使用同步返回值的形式拿到異步promise的結(jié)果

  1. await通過阻塞進程,使同步代碼暫停執(zhí)行, 等Promise異步任務得到結(jié)果后,繼續(xù)執(zhí)行同步指令,
  2. 所以,(await is only valid in async function await)僅允許在異步函數(shù)中使用,
  3. 他只會阻塞異步函數(shù)中的同步代碼, 不會阻塞整個進程)

6.2 練習題 await 同步語法練習

  1. 練習
var p = new Promise(function(resolve){
    setTimeout(() => {
        resolve("成功")
    }, 100);
})
// 正常情況下, 一般在promise對象的then方法的回調(diào)中拿到結(jié)果
p.then(function(res){ console.log(res)} );
console.log("-------------", 0)
async function fun(){
    console.log(1)
    var data = await p;
    console.log(2)
    console.log(3,data);
}
fun()
console.log(4)

輸出
結(jié)果.png

  1. 強化題
  function testWait() {
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    resolve("測試wait")
                },1000)
            })
        }
        async function test() {
          const r1 = await testAsy(true)
          console.log("結(jié)果 wait:",r1);
          const r2 = await testWait()
          console.log("結(jié)果 wait:",r2);
        }
        test()

6.2 分析

1.testWait()本身就是返回的promise,異步的,所以不需要加async
2.使用async/await語法對比
3.await放置在Promise調(diào)用之前俭令,await強制等待后面代碼執(zhí)行后德,直到Promise對象resolve部宿,得到resolve的值作為await表達式的運算結(jié)果
4.await只能在async函數(shù)內(nèi)部使用,用在普通函數(shù)里就會報錯


6.3 then處理

await直接脫掉了一層then的殼 比較方便


6.4 catch

 function testWait() {
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    resolve("測試wait")
                },1000)
            })
        }
        async function test() {
            const r1 = await testAsy(true)
            console.log("結(jié)果 wait:",r1);
            const r2 = await testWait()
            console.log("結(jié)果 wait:",r2);

          try{
            let res3 =   await testAsy(false)
            console.log("結(jié)果-3:",res3)
             } catch(error){
            console.log("-------",error)
           }
        }
        test()

其實就是結(jié)合 try{}catch{}來搞


7.react 使用

 async  componentDidMount(){
     try{
        let res1 =   await  axios.get("/v1/use?type=1")
        console.log("結(jié)果:",res1)
     } catch(error){
        console.log("-------",error)
     }

8. vue3 使用

 async created() {
  this.characters = (await getList()).data
}

9. 多異步任務并發(fā)執(zhí)行解決方案

// 異步函數(shù)用法舉例: 
var fs = require("fs")
var p1 = new Promise(function(resolve){
    fs.readFile("./data/a.txt",function(err,data){
        resolve(data)
    })  
})
var p2 = new Promise(function(resolve){
    fs.readFile("./data/b.txt",function(err,data){
        resolve(data)
    })  
})
var p3 = new Promise(function(resolve){
    fs.readFile("./data/c.txt",function(err,data){
        resolve(data)
    })  
})
var p4 = new Promise(function(resolve){
    fs.readFile("./data/d.txt",function(err,data){
        resolve(data)
    })  
})
// 多異步任務并發(fā)執(zhí)行方案一: promise合并
var allP = Promise.all([p1,p2,p3,p4])
allP.then(function(res){
    console.log(res.join(""))
})
// 多異步任務并發(fā)執(zhí)行方案二: 異步函數(shù)
async function getData(){
    var data1 = await p1;
    var data2 = await p2;
    var data3 = await p3;
    var data4 = await p4;
    console.log(data1 + data2 + data3 + data4)
}
getData()

10. 擴展下規(guī)范的幾個階段

1.編輯草案 Editor's Draft (ED)
2.工作草案 Working Draft (WD)
3.過渡-最后通告工作草案 Transition – Last Call Working Draft (LCWD)
4.候選推薦標準 Candidate Recommendation (CR)
5.過渡-建議推薦標準 Transition – Proposed 6.Recommendations (PR)
7.推薦標準 Recommendation (REC)


參考資料

promise-ajax封裝
fetch基礎(chǔ)
promise基礎(chǔ)
vue3-ts-async


初心

我所有的文章都只是基于入門,初步的了解瓢湃;是自己的知識體系梳理;
如果能幫助到有緣人,非常的榮幸,一切為了部落的崛起;
共勉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末理张,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绵患,更是在濱河造成了極大的恐慌雾叭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件落蝙,死亡現(xiàn)場離奇詭異织狐,居然都是意外死亡暂幼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門移迫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺嬉,“玉大人,你說我怎么就攤上這事厨埋⌒跋保” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵荡陷,是天一觀的道長雨效。 經(jīng)常有香客問我,道長废赞,這世上最難降的妖魔是什么徽龟? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮唉地,結(jié)果婚禮上顿肺,老公的妹妹穿的比我還像新娘。我一直安慰自己渣蜗,他們只是感情好屠尊,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耕拷,像睡著了一般讼昆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骚烧,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天浸赫,我揣著相機與錄音,去河邊找鬼赃绊。 笑死既峡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的碧查。 我是一名探鬼主播运敢,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忠售!你這毒婦竟也來了传惠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稻扬,失蹤者是張志新(化名)和其女友劉穎卦方,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泰佳,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡盼砍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年尘吗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浇坐。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡摇予,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吗跋,到底是詐尸還是另有隱情侧戴,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布跌宛,位于F島的核電站酗宋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疆拘。R本人自食惡果不足惜蜕猫,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哎迄。 院中可真熱鬧回右,春花似錦、人聲如沸漱挚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨涝。三九已至蹬屹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間白华,已是汗流浹背慨默。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弧腥,地道東北人厦取。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像管搪,于是被迫代替她去往敵國和親虾攻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容