首頁  >  文章  >  web前端  >  async/await 並行請求與錯誤處理

async/await 並行請求與錯誤處理

不言
不言原創
2018-07-07 17:57:212461瀏覽

這篇文章主要介紹了關於async/await 並行請求和錯誤處理,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

async 順序

#並發請求

使用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 : ')
})()

使用Promise.all來並發請求

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...catch

  try {
    const user3 = await fetchUser(true)
  } catch (err) {
    console.error('user3 error:', err)
  }

包裝promise,使其傳回統一的格式的程式碼

參考文章

  /**
   * 包装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)
  }

繼續使用catch

  // 因为async 返回的promise对象,所以可以使用catch
  const user4 = await fetchUser(true).catch(err => {
    console.error('user4 error:', err)
  })
有興趣的可以用弄得運行一下程式碼,
測試程式碼

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

node爬取拉勾網資料並匯出為excel檔案

原生JS基於window. scrollTo()封裝垂直捲動動畫工具函數

瀏覽器與NodeJS的EventLoop異同以及部分機

以上是async/await 並行請求與錯誤處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn