這篇文章主要介紹了關於async/await 並行請求和錯誤處理,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
使用async的時候,程式碼執行的順序很容易出錯,例如我們要同時發起兩個請求,可能會寫出下面的程式碼
function fetchName () { return new Promise((resolve, reject) => { setTimeout(() => { resolve('lujs') }, 3000) }) } function fetchAvatar () { return new Promise((resolve, reject) => { setTimeout(() => { resolve('https://avatars3.githubusercontent.com/u/16317354?s=88&v=4') }, 4000) }) } async fetchUser () { const name = await fetchName() const avatar = await fetchAvatar() return { name, avatar } } (async function () { console.time('should be 7s ') const user = await fetchUser() console.log(user) console.timeEnd('should be 3s ') })()
在上面的程式碼中,我們認為fetchName,fetchAvatar會並行執行,實際上並不會。 fetchAvatar會等待fetchName執行完後才開始請求。 fetchUser函數的執行時間不是三秒而是7秒
要並行請求的話需要像下面這樣寫,fetchUserParallel的執行時間為4秒
async function fetchUserParallel () { const namePromise = fetchName() const avatarPromise = fetchAvatar() return { name: await namePromise, avatar: await avatarPromise } } (async function () { console.time('should be 3s, but time is ') const user = await fetchUser() console.log(user) console.timeEnd('should be 3s, but time is ') console.time('should be 3s : ') const user2 = await fetchUserParallel() console.log(user2) console.timeEnd('should be 3s : ') })()
function fetchList (id) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(`id is : ${id}`) }, 5000) }) } async function getList () { const ary = [1, 2, 3, 4] const list = Promise.all( ary.map( (id) => fetchList(id))) return await list } (async function () { // 使用promise并发请求 console.time('should be 3s ') const list = await getList() console.log(list) console.timeEnd('should be 3s ') })()
try { const user3 = await fetchUser(true) } catch (err) { console.error('user3 error:', err) }
參考文章
/** * 包装promise, 使其返回统一的错误格式 * @param {Promise} promise */ function to (promise) { return promise.then(res => [null, res]).catch(err => [err]) } . . . const [err, res] = await to(fetchUser(true)) if (err) { console.error('touser err:', err) }
// 因为async 返回的promise对象,所以可以使用catch const user4 = await fetchUser(true).catch(err => { console.error('user4 error:', err) })
有興趣的可以用弄得運行一下程式碼,
測試程式碼
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
原生JS基於window. scrollTo()封裝垂直捲動動畫工具函數
以上是async/await 並行請求與錯誤處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!