Promise在循環(huán)體中需要注意的一些事項(xiàng)

我們首先知道,promise的then返回的始終是一個(gè)新promise权谁。那么就存在下述情況

let aPromise = new Promise((resolve,reject)=>{
    resolve('aPromise')
})

aPromise.then(res=>'bPromise')
aPromise.then(res=>{console.log(res)}) // 實(shí)際上打印的是'aPromise'

then不是改變aPromise的內(nèi)容,而是始終返回新promise憋沿。

如此旺芽,當(dāng)我們要寫(xiě)一個(gè)循環(huán)體的時(shí)候。就需要一個(gè)游標(biāo)來(lái)記錄每次執(zhí)行完的then辐啄。

let delayPrint = (i = 1000) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(i);
            resolve('ok:'+i)
        }, 1000)
    })
}

let forbody = Promise.resolve('begin');
for (let i = 1; i <= 5; i++) {
    forbody = forbody.then(res=>{
        return delayPrint(i);
    })
}

我們的forbody每次重新記錄forbody.then返回的新promise采章。這樣下次執(zhí)行forbody.then的時(shí)候總能記錄正確的位置。利用這一特性壶辜,我們可以制造循環(huán)體悯舟。上述代碼可以依次打印1,2,3,4,5。需要注意的是如果把console.log(i)放入then中砸民,變成console.log(res)會(huì)存在一個(gè)業(yè)務(wù)位置的問(wèn)題图谷。區(qū)別在于打印完5后立即結(jié)束翩活,還是會(huì)再執(zhí)行下一個(gè)而不打印。原因時(shí)i=5時(shí)執(zhí)行完成后還會(huì)return一個(gè)delayPrint便贵,相當(dāng)于多執(zhí)行了一次菠镇。雖然沒(méi)有下次的then。

也有一些比較丑陋的解決方案承璃。如

let forbody = Promise.resolve('begin');
for (let i = 1; i <= 5; i++) {
    forbody = forbody.then(res=>{
        i!=5 && return delayPrint(i*1000);
    })
}

改良方案利耍,用其他方式實(shí)現(xiàn)循環(huán)體

面對(duì)定長(zhǎng)的的循環(huán)體】猓可以用遍歷數(shù)組 + Promise.all的方式來(lái)實(shí)現(xiàn)隘梨。
使用這種方式很直觀,并且在執(zhí)行完成后能一次性得到所有的resolve

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舷嗡,一起剝皮案震驚了整個(gè)濱河市轴猎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌进萄,老刑警劉巖捻脖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異中鼠,居然都是意外死亡可婶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)援雇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矛渴,“玉大人,你說(shuō)我怎么就攤上這事惫搏【呶拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵筐赔,是天一觀的道長(zhǎng)桂躏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)川陆,這世上最難降的妖魔是什么剂习? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮较沪,結(jié)果婚禮上鳞绕,老公的妹妹穿的比我還像新娘。我一直安慰自己尸曼,他們只是感情好们何,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著控轿,像睡著了一般冤竹。 火紅的嫁衣襯著肌膚如雪拂封。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天鹦蠕,我揣著相機(jī)與錄音冒签,去河邊找鬼。 笑死钟病,一個(gè)胖子當(dāng)著我的面吹牛萧恕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肠阱,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼票唆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了屹徘?” 一聲冷哼從身側(cè)響起走趋,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎噪伊,沒(méi)想到半個(gè)月后簿煌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酥宴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年啦吧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了您觉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拙寡。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琳水,靈堂內(nèi)的尸體忽然破棺而出肆糕,到底是詐尸還是另有隱情,我是刑警寧澤在孝,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布诚啃,位于F島的核電站,受9級(jí)特大地震影響私沮,放射性物質(zhì)發(fā)生泄漏始赎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一仔燕、第九天 我趴在偏房一處隱蔽的房頂上張望造垛。 院中可真熱鬧,春花似錦晰搀、人聲如沸五辽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杆逗。三九已至乡翅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罪郊,已是汗流浹背蠕蚜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留排龄,地道東北人波势。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像橄维,于是被迫代替她去往敵國(guó)和親尺铣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 再過(guò)幾天就是3月8日了,原來(lái)的38是叫婦女節(jié)竞川,以前有沒(méi)有在香港電影里經(jīng)常聽(tīng)到罵女人都會(huì)罵“死38”“臭38”店溢。。委乌。...
    同韓閱讀 454評(píng)論 0 0
  • 在寫(xiě)作過(guò)程中床牧,無(wú)論遇到什么的困難,哪怕已經(jīng)寫(xiě)不下去遭贸,也要去挑戰(zhàn)一切戈咳,完成目標(biāo)。每天去寫(xiě)作壕吹,已經(jīng)形成了一種心里反應(yīng)著蛙,...
    千云變閱讀 115評(píng)論 0 0