中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS循環中正確使用async、await的方法是什么

發布時間:2021-12-18 13:16:05 來源:億速云 閱讀:207 作者:柒染 欄目:開發技術

JS循環中正確使用async、await的方法是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

概覽(循環方式 - 常用)

  • for

  • map

  • forEach

  • filter

聲明遍歷的數組和異步方法

聲明一個數組:??

const skills = ['js', 'vue', 'node', 'react']

再聲明一個promise的異步代碼: ??

function getSkillPromise (value) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(value)
    }, 1000)
  })
}

for 循環中使用

由于for循環并非函數,而async、await需要在函數中使用,因此需要在for循環外套一層function

async function test () {
  for (let i = 0; i < skills.length; i++) {
    const skill = skills[i]
    const res = await getSkillPromise(skill)
    console.log(res)
  }
}

test() // 調用

JS循環中正確使用async、await的方法是什么

當使用await時,希望JavaScript暫停執行,直到等待 promise 返回處理結果。上述結果意味著for循環中有異步代碼,是可以等到for循環中異步代碼完全跑完之后再執行for循環后面的代碼。

但是他不能處理回調的循環,如forEach、map、filter等,下面具體分析。

map 中使用

在map中使用await, map 的返回值始是promise數組,這是因為異步函數總是返回promise。

async function test () {
  console.log('start')
  const res = skills.map(async item => {
    return await getSkillPromise(item)
  })
  console.log(res)
  console.log('end')
}

test()

結果:始終為promise數組

start
[
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> }
]
end

若果你想要等到promise的返回結果,可以使用promise.all()處理一下

async function test () {
  console.log('start')
  const res = skills.map(async item => {
    return await getSkillPromise(item)
  })
  const resPromise = await Promise.all(res)
  console.log(resPromise)
  console.log('end')
}

test()

// 結果
start
[ 'js', 'vue', 'node', 'react' ]
end

forEach 中使用

先上代碼和結果

async function test () {
  console.log('start')
  skills.forEach(async item => {
    const res = await getSkillPromise(item)
    console.log(res)
  })
  console.log('end')
}

test()

預期結果

'Start'

'js'

'vue'

'node'

'react'

'End'

實際結果 在forEach循環等待異步結果返回之前就執行了console.log('end')

'Start'

'End'

'js'

'vue'

'node'

'react'

JavaScript 中的 forEach不支持 promise 感知,也支持 async 和await,所以不能在 forEach 使用 await 。

filter 中使用

使用filter過濾item為vue或者react的選項

正常使用 filter:

async function test () {
  console.log('start')
  const res = skills.filter(item => {
    return ['vue', 'react'].includes(item)
  })
  console.log(res)
  console.log('end')
}

test() // 調用

// 結果
start
[ 'vue', 'react' ]
end

使用 await后:

async function test () {
  console.log('start')
  const res = skills.filter(async item => {
    const skill = await getSkillPromise(item)
    return ['vue', 'react'].includes(item)
  })
  console.log(res)
  console.log('end')
}

test()

預期結果:

start

[ 'vue', 'react' ]

end

實際結果:

[ 'js', 'vue', 'node', 'react' ]

end

結論:因為異步函數getSkillPromise返回結果返回的promise總是真的,所以所有選項都通過了過濾

  1. 如果你想連續執行await調用,請使用for循環(或任何沒有回調的循環)。

  2. 永遠不要和forEach一起使用await,而是使用for循環(或任何沒有回調的循環)。

  3. 不要在 filter 和 reduce 中使用 await,如果需要,先用 map 進一步驟處理,然后在使用 filter 和 reduce 進行處理。

關于JS循環中正確使用async、await的方法是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

交口县| 宜宾县| 鸡泽县| 宜州市| 泾川县| 甘孜| 彭州市| 象州县| 德化县| 娱乐| 襄城县| 抚宁县| 犍为县| 滦南县| 宜昌市| 青铜峡市| 建湖县| 鄄城县| 岑巩县| 天津市| 仙游县| 济宁市| 洪雅县| 电白县| 普安县| 县级市| 班玛县| 洛南县| 个旧市| 大余县| 芮城县| 西城区| 兴山县| 天祝| 威信县| 嘉鱼县| 民权县| 璧山县| 科技| 乐业县| 申扎县|