JavaScript >> Javascript 文檔 >  >> JavaScript

Promise.all 與 Async/Await

假設我有一個 API 調用,它從數據庫中返回所有用戶,並且需要一些時間才能完成。

// First promise returns an array after a delay
const getUsers = () => {
  return new Promise((resolve, reject) => {
    return setTimeout(
      () => resolve([{ id: 'jon' }, { id: 'andrey' }, { id: 'tania' }]),
      600
    )
  })
}

現在有另一個調用依賴於整個用戶數組中存在的一些信息。

// Second promise relies on the result of first promise
const getIdFromUser = (user) => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(user.id), 500)
  })
}

第三個調用修改了第二個調用。

// Third promise relies on the result of the second promise
const capitalizeIds = (id) => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(id.toUpperCase()), 200)
  })
}

我可能會嘗試運行第一個電話,然後使用 for...of 循環運行依賴它的後續調用。

const runAsyncFunctions = async () => {
  const users = await getUsers()

  for (let user of users) {
    const userId = await getIdFromUser(user)
    console.log(userId)

    const capitalizedId = await capitalizeIds(userId)
    console.log(capitalizedId)
  }

  console.log(users)
}

runAsyncFunctions()

但是,這將是我的輸出:

jon
JON
andrey
ANDREY
tania
TANIA
(3) [{…}, {…}, {…}]

我可以使用 Promise.all() 而是先運行所有第一個函數,然後運行所有第二個函數,然後運行所有第三個函數。

const runAsyncFunctions = async () => {
  const users = await getUsers()

  Promise.all(
    users.map(async (user) => {
      const userId = await getIdFromUser(user)
      console.log(userId)

      const capitalizedId = await capitalizeIds(userId)
      console.log(capitalizedId)
    })
  )

  console.log(users)
}
(3) [{…}, {…}, {…}]
jon
andrey
tania
JON
ANDREY
TANIA

希望對某人有所幫助。

這是您可以在控制台中運行的整個代碼段。

// First promise returns an array
const getUsers = () => {
  return new Promise((resolve, reject) => {
    return setTimeout(
      () => resolve([{ id: 'jon' }, { id: 'andrey' }, { id: 'tania' }]),
      600
    )
  })
}

// Second promise relies on the resulting array of first promise
const getIdFromUser = (user) => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(user.id), 500)
  })
}

// Third promise relies on the result of the second promise
const capitalizeIds = (id) => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(id.toUpperCase()), 200)
  })
}

const runAsyncFunctions = async () => {
  const users = await getUsers()

  Promise.all(
    users.map(async (user) => {
      const userId = await getIdFromUser(user)
      console.log(userId)

      const capitalizedId = await capitalizeIds(userId)
      console.log(capitalizedId)
    })
  )

  console.log(users)
}

runAsyncFunctions()

Tutorial JavaScript 教程
  1. tsParticles 1.24.1 發布

  2. Firefox 渲染錯誤在記錄時間內修復

  3. React Native 與 Firebase Cloud Functions 和 Gitlab CI

  4. 如何使用 Express/Node 以編程方式發送 404 響應?

  5. 我是如何根據突擊隊遊戲製作簡歷的

  6. 將設置對象與 Lodash 相結合:_.assign 還是 _.merge?

  7. 非加載阻塞異步 JS

  1. JS 面試 2 分鐘 / 備忘💭

  2. 如何使用 JavaScript 獲取光標下的單詞?

  3. Rubyists 的 NPM 版本約束指南

  4. React 中的 7 種優化技術

  5. 了解 JavaScript 中的箭頭函數

  6. 在 Ubuntu 終端中顯示的語法突出顯示

  7. 心智模型

  1. [Node.js] 保護您的應用程序第 3/3 部分

  2. 表格很難

  3. 使用 Kendo UI 在 Angular 中構建動畫登錄表單

  4. Helm 圖表分佈