我們在使用 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]}`)
})()