javascript異步解決方案簡介及數(shù)組遍歷中async用法

我們知道删性,javascript是單線程的亏娜,任務只能依次排開,蹬挺,挨個執(zhí)行维贺,但是為了完成某些并行的需求,類似網(wǎng)絡請求(網(wǎng)絡請求有單獨的線程去處理)巴帮,就必須引入異步的概念溯泣,簡單來理解就是:我想要吃飯,但是做好飯需要十分鐘榕茧,這十分鐘我不能待著垃沦,我要玩手機,等飯做好了用押,我再繼續(xù)吃飯肢簿。

最傳統(tǒng)普遍的異步解決方案就是寫回調函數(shù),

定時器

setTimeout(function(){
    console.log("開始吃飯")
},600000)

網(wǎng)絡請求

$post("www.chifan.com",function(res){
    console.log("吃飯")
})

這會產生幾個問題
回調地獄蜻拨,難處理的異常译仗,非常不優(yōu)雅的代碼。官觅。

隨著前端應用復雜性的不斷提升,回調函數(shù)越來越不能滿足我們的需求阐污,幾種解決方案被提了出來休涤,
Promise,Generator,async/await

Promise

new Promise(function(resolve,reject){
    if("做好飯"){
        resolve("飯好了")
    }
    else{
        reject("飯糊了")
    }
})
.then(res=>{
    console.log("吃飯")
})
.catch(err=>{
    console.log("吃不成了")
})

Generator

function* chifan(){
    yeild 'chifan'
}
new chifan().next()

async/await

async function(){
    await zuofan();
    return "吃飯了"
}

下面我們著重來介紹下promise,因為promise + async await 是業(yè)界異步解決方案最優(yōu)雅的解法了笛辟,大約只有c# 和 nodejs 原生實現(xiàn)了此特性

我們先看下PromiseA+規(guī)范

  • "promise"是一個函數(shù)功氨,攜帶有滿足規(guī)范的then方法
  • "promise" 有三種狀態(tài),pending手幢,onFulfilled捷凄,onRejected,且從pending只能切換到onFulfilled或者onRejected一種狀態(tài)围来,不能切換
  • then方法返回的也是promise跺涤,且可以鏈式調用

看懂了規(guī)范我們先來演示一下在promise 和 async await下我們如何解決異步問題。

比如我們想要在兩秒之后打印吃飯监透,吃完飯三秒后打印睡覺桶错,傳統(tǒng)回調寫法

setTimeout(function(){
    console.log('吃飯');
    setTimeout(function(){
        console.log('睡覺')
    },3000)
},2000)

promise 寫法

new Promise(function(res,rej){
    setTimeout(function(){
        console.log("吃飯")
        res()
    },2000)
})
.then(res=>{
    return new Promise(function(res,rej){
         setTimeout(function(){
               console.log("睡覺")
              res()
        },3000)
    })
})
.then(res=>{

},
reject=>{
  console.log("異常")
})
.catch(err=>{
    console.log(err)
})

async await 寫法

(async function(){
    await new Promise(function(res,rej){
      setTimeout(function(){
          console.log("吃飯")
          res()
      },2000)
    })

  await new Promise(function(res,rej){
         setTimeout(function(){
               console.log("睡覺")
              res()
        },3000)
    })
})()

是不是感覺越寫越像同步呢。
async 關鍵字用于匿名函數(shù)前面或者函數(shù)名字前面胀蛮,有了這個關鍵字院刁,函數(shù)內部可以使用await關鍵字,await關鍵字后面跟著一個promise對象粪狼,可以是函數(shù)返回一個promsie對象或者new 的一個promise對象退腥,而每個await對應promise之后的代碼任岸,都會在當前await對應的promise resolve 之后才會執(zhí)行,相當于將當前await 對應promise之后的代碼包裹到了then 之中執(zhí)行享潜,,然后如果又碰到await米碰。還是同理,一層層包裹吕座,保證了多個await 對應promise的順序執(zhí)行

現(xiàn)在async中的代碼可以順序執(zhí)行了,但是當前加了async 關鍵字的函數(shù)還是無法保證其他的函數(shù)在此函數(shù)執(zhí)行完之后執(zhí)行瘪板,因為瀏覽器的事件循環(huán)機制中吴趴,promise是放在微任務隊列中執(zhí)行的,侮攀,
因此,async 函數(shù)的返回值也是一個promise撇叁,無法保證當前async 函數(shù)后面的函數(shù)在此函數(shù)所有內容執(zhí)行完之后執(zhí)行,如果多個async 函數(shù)并行執(zhí)行畦贸,我們還是需要將它當成promsie 進行處理陨闹。

也就是說 async 的返回值是一個promise

這時候如果我們在es5 提供的數(shù)組的遍歷函數(shù)中使用async await 會產生一些難以預料的問題,如果你對async await promise 非常了解了薄坏,可以在 forEach趋厉,map胶坠, filter等中使用,類似這種

    [1,2,3].map(async _=>{
        await new Promise();
        return _+1
   })

    // 執(zhí)行其他代碼 

這個時候的函數(shù)執(zhí)行時序會有些復雜沈善,如果你理解了本文,可以預見到執(zhí)行的結果闻牡,

如果你不是非常明白他的執(zhí)行時序,建議遇到循環(huán)時澈侠,還是乖乖的寫for循環(huán)吧。。写妥。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末审姓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子魔吐,更是在濱河造成了極大的恐慌,老刑警劉巖酬姆,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辞色,死亡現(xiàn)場離奇詭異骨宠,居然都是意外死亡相满,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門匿又,熙熙樓的掌柜王于貴愁眉苦臉地迎上來建蹄,“玉大人碌更,你說我怎么就攤上這事躲撰。” “怎么了拢蛋?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵蔫巩,是天一觀的道長。 經(jīng)常有香客問我圆仔,道長,這世上最難降的妖魔是什么个从? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮嗦锐,結果婚禮上,老公的妹妹穿的比我還像新娘奕污。我一直安慰自己,他們只是感情好贾陷,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布嘱根。 她就那樣靜靜地躺著,像睡著了一般儿子。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柔逼,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天愉适,我揣著相機與錄音犯助,去河邊找鬼维咸。 笑死,一個胖子當著我的面吹牛癌蓖,可吹牛的內容都是我干的。 我是一名探鬼主播租副,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼用僧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了责循?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤秸抚,失蹤者是張志新(化名)和其女友劉穎速和,沒想到半個月后耸别,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡慈迈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年省有,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢沿。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恤磷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情扫步,我是刑警寧澤匈子,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站虎敦,受9級特大地震影響,放射性物質發(fā)生泄漏其徙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一访锻、第九天 我趴在偏房一處隱蔽的房頂上張望通贞。 院中可真熱鬧朗若,春花似錦昌罩、人聲如沸灾馒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旭斥。三九已至,卻和暖如春垂券,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菇爪。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工柒昏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人职祷。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像是尖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子析砸,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353