async/await異步不阻塞調用

es6有兩個新的異步語法,一個是async,await,一個是promise,二者我更青睞於async,await,緣由很簡單,async,await語法糖讓代碼更清晰,更直觀。
簡單的講一下,async函數返回一個 Promise 對象,能夠使用then方法添加回調函數。當函數執行的時候,一旦遇到await就會先返回,等到異步操做完成,再接着執行函數體內後面的語句。那其實就是說在async函數內,每當遇到await關鍵字的時候,函數就是阻塞住,必須等到異步操做有結果時纔會往下繼續執行,思考下,咱們關心的異步返回的結果,那麼也就是說咱們能夠異步函數執行的結果儲存起來,在須要的時候再去await,看下面的代碼es6

function asyncAfun() {
    return new Promise((resolove)=>{
        setTimeout(function() {
            resolove(123);
        }, 3000);
    })    
}
function asyncBfun() {
    return new Promise((resolove)=>{
        setTimeout(function() {
            resolove(456);
        }, 3000);
    })    
}
async function test () {
    let a = asyncAfun();//不阻塞
    let b = asyncBfun();//不阻塞
    let _a = await a; //這裏等待a的返回 後面能夠do something
    let _b = await b;//這裏等待b的返回 後面能夠do something
}

那麼當你須要同時併發大量請求,而且等待全部的請求結果完成的時候能夠這麼寫promise

async function test () {
    let a = asyncAfun();
    let b = asyncBfun();
    let _a = await a;
    let _b = await b;
    Promise.all([_a,_b]).then(v=>{
        console.log(v)
    })
}

Promise.all的做用能夠去MDN查,相似的還有Promise.race併發

學以至用,以上異步

相關文章
相關標籤/搜索