async/await 里的並行和串行


我們在使用 async/await 語法時,有時會這樣用:

function getName () {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve('tony')
        }, 2000)
    })
}
function getId () {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve('123')
        }, 3000)
    })
}

;(async ()=>{
    let name = await getName()
    let id = await getId()
    alert(`name:${name}, id:${id}`)
})()

一眼看上去,應該是3秒種多一點就會 alert 出 'name:tony, id:123',實際上卻花費了5秒才出現提示框,她們是串行執行的!而我們想要的是並行執行,因為她們之間並沒有依賴關系。串行執行只會白白增加無謂的等待時間!怎么解決呢?

我們先看 Promise 的語法:

new Promise( function(resolve, reject) {...} /* executor */ );
executor是帶有 resolve 和 reject 兩個參數的函數 。 Promise構造函數執行時立即 調用executor 函數 , resolve 和 reject 兩個函數作為參數傳遞給executor(executor 函數在Promise構造函數返回新建對象前被調用)。resolve 和 reject 函數被調用時,分別將promise的狀態改為fulfilled(完成)或rejected(失敗)。executor 內部通常會執行一些異步操作,一旦完成,可以調用resolve函數來將promise狀態改成fulfilled,或者在發生錯誤時將它的狀態改為rejected。

傳給 Promise 作為參數的函數會在 new 創建實例時立即調用

上面的代碼,可以分解成這樣:

;(async ()=>{
    let namePromise = getName()
    let name = await namePromise
    let idPromise = getId()              //  2000ms之后才生成 Promise 實例
    let id = await idPromise
    alert(`name:${name}, id:${id}`)
})()

所以,如果想並行執行,我們應該先生成所有需要使用的Promise實例:

;(async ()=>{
    let namePromise = getName()
    let idPromise = getId()              // 先生成所有 promise 實例
    let name = await namePromise
    let id = await idPromise
    alert(`name:${name}, id:${id}`)
})()

或者使用Promise.all

;(async ()=>{
    var result = await Promise.all([getName(), getId()])
    alert(`name:${result[0]}, id:${result[2]}`)
})()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM