最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS循環(huán)中正確使用async、await的姿勢分享

 更新時(shí)間:2021年12月17日 16:28:36   作者:畢了業(yè)就退休  
async?/?await是ES7的重要特性之一,也是目前社區(qū)里公認(rèn)的優(yōu)秀異步解決方案,下面這篇文章主要給大家介紹了關(guān)于JS循環(huán)中正確使用async、await的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

概覽(循環(huán)方式 - 常用)

  • for
  • map
  • forEach
  • filter

聲明遍歷的數(shù)組和異步方法

聲明一個(gè)數(shù)組:??

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

再聲明一個(gè)promise的異步代碼: ??

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

for 循環(huán)中使用

由于for循環(huán)并非函數(shù),而async、await需要在函數(shù)中使用,因此需要在for循環(huán)外套一層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() // 調(diào)用

當(dāng)使用await時(shí),希望JavaScript暫停執(zhí)行,直到等待 promise 返回處理結(jié)果。上述結(jié)果意味著for循環(huán)中有異步代碼,是可以等到for循環(huán)中異步代碼完全跑完之后再執(zhí)行for循環(huán)后面的代碼。

但是他不能處理回調(diào)的循環(huán),如forEach、map、filter等,下面具體分析。

map 中使用

在map中使用await, map 的返回值始是promise數(shù)組,這是因?yàn)楫惒胶瘮?shù)總是返回promise。

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

test()

結(jié)果:始終為promise數(shù)組

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

若果你想要等到promise的返回結(jié)果,可以使用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()

// 結(jié)果
start
[ 'js', 'vue', 'node', 'react' ]
end

forEach 中使用

先上代碼和結(jié)果

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

test()

預(yù)期結(jié)果

'Start'

'js'

'vue'

'node'

'react'

'End'

實(shí)際結(jié)果 在forEach循環(huán)等待異步結(jié)果返回之前就執(zhí)行了console.log('end')

'Start'

'End'

'js'

'vue'

'node'

'react'

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

filter 中使用

使用filter過濾item為vue或者react的選項(xiàng)

正常使用 filter:

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

test() // 調(diào)用

// 結(jié)果
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()

預(yù)期結(jié)果:

start

[ 'vue', 'react' ]

end

實(shí)際結(jié)果:

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

end

結(jié)論:因?yàn)楫惒胶瘮?shù)getSkillPromise返回結(jié)果返回的promise總是真的,所以所有選項(xiàng)都通過了過濾

附使用小結(jié)

  1. 如果你想連續(xù)執(zhí)行await調(diào)用,請使用for循環(huán)(或任何沒有回調(diào)的循環(huán))。
  2. 永遠(yuǎn)不要和forEach一起使用await,而是使用for循環(huán)(或任何沒有回調(diào)的循環(huán))。
  3. 不要在 filter 和 reduce 中使用 await,如果需要,先用 map 進(jìn)一步驟處理,然后在使用 filter 和 reduce 進(jìn)行處理。

結(jié)語:由于工作中遇到了超大表單抽離組件,異步校驗(yàn)是遇到了此問題,后來經(jīng)過查閱資料總結(jié)出來的結(jié)果

總結(jié)

到此這篇關(guān)于JS循環(huán)中正確使用async、await的文章就介紹到這了,更多相關(guān)JS循環(huán)中使用async、await內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解JS設(shè)計(jì)模式之橋接模式用法

    詳解JS設(shè)計(jì)模式之橋接模式用法

    javascript橋接橋接設(shè)計(jì)模式(Bridge Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它用于將抽象部分與其具體實(shí)現(xiàn)部分分離,使它們可以獨(dú)立地變化,本文將通過代碼示例詳解的給大家介紹一下JS橋接模式,需要的朋友可以參考下
    2023-08-08
  • 生成無限制的微信小程序碼的示例代碼

    生成無限制的微信小程序碼的示例代碼

    這篇文章主要介紹了生成無限制的微信小程序碼的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 原生js實(shí)現(xiàn)復(fù)制對象、擴(kuò)展對象 類似jquery中的extend()方法

    原生js實(shí)現(xiàn)復(fù)制對象、擴(kuò)展對象 類似jquery中的extend()方法

    jq的extend()方法能很方便的實(shí)現(xiàn)擴(kuò)展對象方法,這里要實(shí)現(xiàn)的是:原生js實(shí)現(xiàn)復(fù)制對象,擴(kuò)展對象,類似jq中的extend()方法,需要的朋友可以參考下
    2014-08-08
  • js文本框輸入內(nèi)容智能提示效果

    js文本框輸入內(nèi)容智能提示效果

    這篇文章主要介紹了js文本框輸入內(nèi)容智能提示效果,非常簡單實(shí)用,需要的朋友可以參考下
    2015-12-12
  • Java 正則表達(dá)式學(xué)習(xí)總結(jié)和一些小例子

    Java 正則表達(dá)式學(xué)習(xí)總結(jié)和一些小例子

    字符串處理是許多程序中非常重要的一部分,它們可以用于文本顯示,數(shù)據(jù)表示,查找鍵和很多目的.在Unix下,用戶可以使用正則表達(dá)式的強(qiáng)健功能實(shí)現(xiàn)這些 目的
    2012-09-09
  • JavaScript函數(shù)式編程(Functional Programming)組合函數(shù)(Composition)用法分析

    JavaScript函數(shù)式編程(Functional Programming)組合函數(shù)(Composition)用法分析

    這篇文章主要介紹了JavaScript函數(shù)式編程(Functional Programming)組合函數(shù)(Composition)用法,結(jié)合實(shí)例形式分析了javascript函數(shù)式編程中組合函數(shù)的概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • javascript實(shí)現(xiàn)漂亮的拖動(dòng)層,窗口拖拽特效

    javascript實(shí)現(xiàn)漂亮的拖動(dòng)層,窗口拖拽特效

    一個(gè)可關(guān)閉、可隨意拖動(dòng)位置的網(wǎng)頁彈出層代碼,美化的相當(dāng)漂亮,簡潔實(shí)用,還可拖動(dòng)改變大小,通過八個(gè)方向改變大小,學(xué)習(xí)這類特效編寫的網(wǎng)頁設(shè)計(jì)者可參閱一下
    2015-04-04
  • 利用JS制作萬年歷的方法

    利用JS制作萬年歷的方法

    本篇文章主要介紹了利用JS制作萬年歷的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • JS實(shí)現(xiàn)自動(dòng)切換文字的導(dǎo)航效果代碼

    JS實(shí)現(xiàn)自動(dòng)切換文字的導(dǎo)航效果代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)自動(dòng)切換文字的導(dǎo)航效果代碼,涉及javascript動(dòng)態(tài)切換頁面樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • uni-app?main.js中全局變量的使用方法示例

    uni-app?main.js中全局變量的使用方法示例

    在進(jìn)行uni-app開發(fā)時(shí),全局變量的合理使用對于提升開發(fā)效率和項(xiàng)目管理具有重要意義,這篇文章主要給大家介紹了關(guān)于uni-app?main.js中全局變量的使用方法,需要的朋友可以參考下
    2025-07-07

最新評論

台东市| 泗阳县| 宜黄县| 临汾市| 申扎县| 枞阳县| 沙坪坝区| 湘潭县| 布拖县| 西充县| 玉田县| 绥滨县| 克什克腾旗| 泰和县| 龙游县| 库伦旗| 资讯 | 徐水县| 仪征市| 深泽县| 太原市| 军事| 区。| 锦屏县| 稻城县| 仁寿县| 荣成市| 平遥县| 虞城县| 平乡县| 封开县| 富蕴县| 什邡市| 长宁区| 易门县| 突泉县| 潞西市| 镇宁| 阳新县| 陵水| 全南县|