async/await 探索(一)await并行矗烛、串行的方式及其在循環(huán)中使用的探討

async/await 基本用法(串行運(yùn)行)

async/await 的提出真正解決了異步過(guò)程中‘回調(diào)地獄’的問(wèn)題辅柴,使用async/await前請(qǐng)讀者先對(duì)Promise對(duì)象有所了解后進(jìn)行閱讀,Promise用法在筆者上一篇隨筆中有所提及瞭吃。

(async ()=>{
    // 抽象一個(gè)函數(shù) 等待相應(yīng)的時(shí)候后返回成功狀態(tài)碌嘀,如果小于0為失敗狀態(tài)
    let waitFun = function (time) {
        return new Promise((resolve, reject)=>{
            if(time>0){
                setTimeout(()=>{
                    resolve(time)
                },time)
            }else {
                reject('執(zhí)行失敗')
            }
        })
    }
//-----------------------------------------------------------------------------------------------------------------------------
        console.time()
        let r1 =await waitFun(3000)
        console.log('輸出結(jié)果:',r1);
        let r2 =await waitFun(2000)
        console.log('輸出結(jié)果:',r2);
        let r3 =await waitFun(1000)
        console.log('輸出結(jié)果:',r3);
        console.timeEnd()
       /**
        * 控制臺(tái)輸出:
        * 輸出結(jié)果: 3000
        * 輸出結(jié)果: 2000
        * 輸出結(jié)果: 1000
        * default: 6002.86572265625ms
        */
})()

可以看到使用await語(yǔ)法可以將3個(gè)異步函數(shù)進(jìn)行串聯(lián),在上一個(gè)異步函數(shù)結(jié)束后再執(zhí)行下一個(gè)異步函數(shù)歪架,因此理論總耗時(shí)為6s筏餐。但如果這個(gè)三個(gè)異步函數(shù)數(shù)據(jù)不相干,想要三個(gè)同時(shí)請(qǐng)求要如何做到牡拇?

async/await 并行運(yùn)行

實(shí)現(xiàn)并行可以通過(guò)兩種方式:

  • 方式1:先聲明好多個(gè)Promise而后await使用可以使多個(gè)計(jì)時(shí)器同時(shí)運(yùn)行魁瞪,截止筆者寫這篇隨便時(shí),還尚未弄清楚其中的原因-_-||。
  • 方式2:使用Promise.all()實(shí)現(xiàn)惠呼。

方式1如下:

console.time('total time')
let fn1 = waitFun(3000);
let fn2 = waitFun(2000);
let fn3 = waitFun(1000);
let r1 = fn1;
console.log('輸出結(jié)果:',await r1);
let r2 =fn2;
console.log('輸出結(jié)果:',await r2);
let r3 =fn3;
console.log('輸出結(jié)果:',await r3);
console.timeEnd('total time')
/**
 * 輸出結(jié)果: 3000
 * fn1 time: 3009 ms
 * 
 * 輸出結(jié)果: 2000
 * fn2 time: 3010 ms
 *  
 * 輸出結(jié)果: 1000
 * fn3 time: 3011 ms
 * 
 *
 * total time: 3011 ms
 */

方式2如下:

console.time('total time')
await Promise.all([
   (async()=>console.log('輸出結(jié)果:',await waitFun(3000)))(),
   (async()=>console.log('輸出結(jié)果:',await waitFun(2000)))(),
   (async()=>console.log('輸出結(jié)果:',await waitFun(1000)))(),
]);
console.timeEnd('total time')
/**
 * 輸出結(jié)果: 1000
 * fn3 time: 1009 ms
 * 
 * 輸出結(jié)果: 2000
 * fn2 time: 2010 ms
 * 
 * 輸出結(jié)果: 3000
 * fn1 time: 3011 ms
 * 
 * total time: 3011 ms
 */

兩種方式還是有所不同的雖然總耗時(shí)导俘,都是理論3s但方式一的結(jié)果是等到所有異步執(zhí)行完畢按序輸出。二方式二則為按照時(shí)間輸出剔蹋。推薦方式二旅薄。

async/await 在循環(huán)中使用

在實(shí)際開(kāi)發(fā)中遇到需要在循環(huán)中使用的 await的方法,以下是經(jīng)過(guò)各種實(shí)驗(yàn)對(duì)循環(huán)中的await進(jìn)行可行性總結(jié)

foreach循環(huán)中使用

在foreach中使用await (結(jié)論:不可用)

    let list = [{waitTime:3000},{waitTime:2000},{waitTime:1000}];
    console.time('total time')
    list.forEach( async (item)=>{
        console.log('輸出結(jié)果:',await waitFun(item.waitTime))
    });
    console.timeEnd('total time')

  /**
    * total time: 0.610107421875ms
    * 輸出結(jié)果: 1000
    * 輸出結(jié)果: 2000
    * 輸出結(jié)果: 3000
    */
    let promiseList = [waitFun(3000),waitFun(2000),waitFun(1000),];    
    console.time('total time')
    promiseList.forEach( async (item)=>{
        console.log('輸出結(jié)果:',await item)
    });
    console.timeEnd('total time')
// 輸出結(jié)果同上

個(gè)人總結(jié) foreach的參數(shù)僅僅一個(gè)參數(shù)回調(diào)而foreach本身并不是一個(gè)AsyncFunction所有foreach循環(huán)本身并不能實(shí)現(xiàn)await效果泣崩。

for中使用

let list = [{waitTime:3000},{waitTime:2000},{waitTime:1000}];
let promiseList = [waitFun(3000),waitFun(2000),waitFun(1000),];
console.time('total time')
    for(let i = 0;i<list.length;i++){
        console.log('輸出結(jié)果:',await waitFun(list[i].waitTime))
    }
console.timeEnd('total time')

輸出結(jié)果: 3000
輸出結(jié)果: 2000
輸出結(jié)果: 1000
total time: 6002.90478515625ms
// 使用 promise 循環(huán)如下
for(let i = 0;i<promiseList.length;i++){
    console.log('輸出結(jié)果:',await promiseList[i]);
}
輸出結(jié)果: 3000
輸出結(jié)果: 2000
輸出結(jié)果: 1000
total time: 3001.793212890625ms

結(jié)論:由以上結(jié)果可以看到 在普通for循環(huán)中我依然可以使用 async/await 處理異步操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末少梁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矫付,更是在濱河造成了極大的恐慌凯沪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买优,死亡現(xiàn)場(chǎng)離奇詭異妨马,居然都是意外死亡挺举,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門烘跺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)湘纵,“玉大人,你說(shuō)我怎么就攤上這事滤淳∥嗯纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脖咐,是天一觀的道長(zhǎng)伤柄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)文搂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任秤朗,我火速辦了婚禮煤蹭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘取视。我一直安慰自己硝皂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布作谭。 她就那樣靜靜地躺著稽物,像睡著了一般。 火紅的嫁衣襯著肌膚如雪折欠。 梳的紋絲不亂的頭發(fā)上贝或,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音锐秦,去河邊找鬼咪奖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酱床,可吹牛的內(nèi)容都是我干的羊赵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扇谣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昧捷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罐寨,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤靡挥,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸯绿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芹血,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贮泞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔烛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啃擦。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饿悬,靈堂內(nèi)的尸體忽然破棺而出令蛉,到底是詐尸還是另有隱情,我是刑警寧澤狡恬,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布珠叔,位于F島的核電站,受9級(jí)特大地震影響弟劲,放射性物質(zhì)發(fā)生泄漏祷安。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一兔乞、第九天 我趴在偏房一處隱蔽的房頂上張望汇鞭。 院中可真熱鬧,春花似錦庸追、人聲如沸霍骄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)读整。三九已至,卻和暖如春咱娶,著一層夾襖步出監(jiān)牢的瞬間米间,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工膘侮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车伞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓喻喳,卻偏偏與公主長(zhǎng)得像另玖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子表伦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容