async函數使用場景

async是Generator函數的語法糖,比起Generator更加具備語義。定義一個Generator函數須要相似於以下方式:ajax

function * test(){
    yield 1;
    yield 2;
    return 3
}
var a = test() //不會執行
a.next();
a.next();
複製代碼

定義async函數只須要:promise

async function test(){
    var a = await 1
    var b = await 2
    return b
}
test().then((res)=>{ // res爲test函數的返回值。可見async會返回一個Promise對象
})
複製代碼

在實際使用中await後面實際上更多的是一個異步函數,例如一個promise對象的操做結果bash

// 模擬接口A
function getA(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            let res = Math.random()
            if(res>0.5){
                resolve(res)
            } else {
                reject(res)
            }
        },2000)

    })
}

// 模擬接口B
function getB(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            let res = Math.random()
            if(res>0.5){
                resolve(res)
            } else {
                reject(res)
            }
        },2000)

    })
}

async function print(){
    let a = await getA().catch((error)=>{
        console.log(error)
    })
    let b = await getB()
    return [a,b]
}

print().then((res)=>{
    console.log('成功',res)
}).catch((err)=>{
    console.log('錯誤',err)
})
複製代碼

上述print函數a變量值須要等到getA執行完畢才能得到。getB須要await getA()執行完畢纔會執行。因此print的執行時間是getA和getB的和。這就是所謂的同步方式執行異步函數。 不過使用同步方式執行異步函數的方式也有侷限性。dom

  1. 若是有耗時任務將會阻塞。 假如getA須要大約耗時10s,則getB不得不等到getA執行完畢。
  2. 若是async內有一個函數發生錯誤,則函數再也不執行,錯誤將直接被catch捕捉,例如getA狀態爲reject.則test().catch((error)=>{})將捕捉錯誤,getB不會執行。若是須要getB繼續執行,須要添加try...catch:
async function print(){
    try{
        let a = await getA()
    }catch(error){
        
    }
    let b = await getB()
    return [a,b]
}
複製代碼

async使得異步操做流程更加有序化,在promise中異步

getA()
getB()
複製代碼

雖然getA定義在前面,但卻不必定會先於getB返回值,這樣在實際開發中可能給咱們形成麻煩,由於實際開發中數據是由依賴的和有前後之分的。因此爲了有序化,單純使用promise咱們不得不使用以下相似代碼:async

getA().then(()=>{
    return getB()
}).then(()=>{
    return getC()
})
...
複製代碼

寫的越多,代碼就不具備可讀性,也不利於調試。使用上述的async+await能夠很爽地寫代碼啦.函數

async function getAsyncData(){
    let a = await getA();
    let b = await getB()
}
getAsyncData().then(()=>{
    
})
複製代碼

咱們把異步操做的函數(例如ajax,讀取文件等)定義在async函數內,配合await能夠使得異步操做有序化,即先getA再執行getB.ui

相關文章
相關標籤/搜索