Promise特點(diǎn)

Promise的使用特點(diǎn)

1.Promise的狀態(tài)一旦改變就無法更改

new Promise(function(resolve,reject){
        resolve();
        reject();
}).then(function(res){

}).catch(function(){

})

只會(huì)執(zhí)行then中的方法,不會(huì)執(zhí)行catch中的

2.then方法的參數(shù)期望是函數(shù)杠步,傳入非函數(shù)則會(huì)發(fā)生值穿透

new Promise(function(resolve,reject){
       resolve(123);
}).then('ASDASDAS').then(function(res){
       console.log(res)
})

會(huì)執(zhí)行第二個(gè)then的回調(diào)

3.promise的回調(diào)是同步的蛹批,then是異步的

new Promise(function(resolve,reject){
        console.log(1);
        resolve();
}).then('ASDASDAS').then(function(res){
        console.log(2)
})
console.log(3)

輸出結(jié)果為 1 3 2

4.鏈?zhǔn)秸{(diào)用then,上一個(gè)then的返回值是下一個(gè)then接收到的參數(shù)腐芍,如果拋出錯(cuò)誤,會(huì)返回一個(gè)狀態(tài)為reject的promise

new Promise(function(resolve,reject){
        resolve();
}).then(function(){
        return 123
}).then(function(last){
        console.log(last)
})

打印123

new Promise(function(resolve,reject){
     resolve();
}).then(function(){
      throw new Error("I'm error ")
}).then(function(last){
      console.log(last)
}).catch(function(error){
      console.log("error:"+error)
})

打印Error: I'm error

如果是then的回調(diào)中return new Error() 還是要進(jìn)入下一個(gè)then中试躏,要throw拋出錯(cuò)誤才會(huì)進(jìn)入到catch中

5.如果返回的是promise 那么會(huì)等待promise的異步執(zhí)行猪勇,根據(jù)異步執(zhí)行的是resolve,還是reject再進(jìn)入then或者catch

new Promise(function(resolve,reject){
     resolve();
}).then(function(){
    return new Promise(function(resolve,reject){
         setTimeout(function(){
            resolve("go to then")
          },3000)
      })
}).then(function(last){
      console.log(last)
}).catch(function(error){
      console.log("error:"+error)
})

三秒之后打印:go to then

JS執(zhí)行順序

事件循環(huán)機(jī)制參考:譯文:JS事件循環(huán)機(jī)制(event loop)之宏任務(wù)椅您、微任務(wù)

image.png

1.每次執(zhí)行時(shí)先執(zhí)行主線程外冀,執(zhí)行主線程的過程中會(huì)碰到宏任務(wù)、微任務(wù)掀泳,各自放到各自的隊(duì)列當(dāng)中雪隧。
2.主線程執(zhí)行完畢之后執(zhí)行微任務(wù)
3.微任務(wù)執(zhí)行完畢之后將一個(gè)宏任務(wù)放到主線程中執(zhí)行
4.此時(shí)再根據(jù)主線程添加宏、微任務(wù)到對(duì)應(yīng)的任務(wù)隊(duì)列

//promise 為微任務(wù)
//setTimeout 為宏任務(wù)
setTimeout(function(){//setT1
    console.log('set1')
    //加到宏任務(wù)隊(duì)列
})
var p1 = new Promise(function(resolve,reject){
    console.log('promise1')
    resolve(2)
})
setTimeout(function(){//setT2
    console.log('set2')
    //加到宏任務(wù)隊(duì)列
})
p1.then(function(){
    console.log('then1')
})
console.log(2)

promise1
2
then1
set1
set2

過程分析:
主線程:[p1=new Promise(),console.log(2)]
微任務(wù)隊(duì)列:[p1.then]
宏觀任務(wù)隊(duì)列:[setT1,setT2]

由于3.promise的回調(diào)是同步的员舵,then是異步的
所以promise的回調(diào)是放在主線程中執(zhí)行的脑沿,then放在微線程中

//promise 為微任務(wù)
//setTimeout 為宏任務(wù)
setTimeout(function(){//setT1
    console.log('set1')
    var p2= new Promise(function(resolve,reject){
      console.log('promise2')
      resolve(2)
    }).then(function(){
          console.log('then2')
    })
    //加到宏任務(wù)隊(duì)列
})
var p1 = new Promise(function(resolve,reject){
    console.log('promise1')
    resolve(2)
})
setTimeout(function(){//setT2
    console.log('set2')
    //加到宏任務(wù)隊(duì)列
})
p1.then(function(){
    console.log('then1')
})
console.log(2)

promise1
2
then1
set1
promise2
then2
set2
過程分析:
主線程 [p1=new Promise,2]
微 [p1.then]
宏 [setT1,setT2]


setT添加到主線程中
主線程 [console.log('set1'),p2=new Promise]
微 [p2.then]
宏 [setT2]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末马僻,一起剝皮案震驚了整個(gè)濱河市庄拇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌韭邓,老刑警劉巖措近,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異女淑,居然都是意外死亡瞭郑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門诗力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰浮,“玉大人,你說我怎么就攤上這事苇本⊥嗉耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓣窄,是天一觀的道長笛厦。 經(jīng)常有香客問我,道長俺夕,這世上最難降的妖魔是什么裳凸? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮劝贸,結(jié)果婚禮上姨谷,老公的妹妹穿的比我還像新娘。我一直安慰自己映九,他們只是感情好梦湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般捌议。 火紅的嫁衣襯著肌膚如雪哼拔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天瓣颅,我揣著相機(jī)與錄音倦逐,去河邊找鬼。 笑死宫补,一個(gè)胖子當(dāng)著我的面吹牛檬姥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播守谓,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼穿铆,長吁一口氣:“原來是場噩夢啊……” “哼您单!你這毒婦竟也來了斋荞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤虐秦,失蹤者是張志新(化名)和其女友劉穎平酿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悦陋,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜈彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俺驶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幸逆。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖暮现,靈堂內(nèi)的尸體忽然破棺而出还绘,到底是詐尸還是另有隱情,我是刑警寧澤栖袋,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布拍顷,位于F島的核電站,受9級(jí)特大地震影響塘幅,放射性物質(zhì)發(fā)生泄漏昔案。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一电媳、第九天 我趴在偏房一處隱蔽的房頂上張望踏揣。 院中可真熱鬧,春花似錦匾乓、人聲如沸捞稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括享。三九已至搂根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铃辖,已是汗流浹背剩愧。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娇斩,地道東北人仁卷。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像犬第,于是被迫代替她去往敵國和親锦积。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 弄懂js異步 講異步之前歉嗓,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop丰介。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,711評(píng)論 0 5
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券鉴分,享受所有官網(wǎng)優(yōu)惠哮幢,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 8,681評(píng)論 0 29
  • 原文地址:http://es6.ruanyifeng.com/#docs/promise Promise 的含義 ...
    AI云棧閱讀 873評(píng)論 0 7
  • 含義 Promise是異步編程的一種解決方案,用于一個(gè)異步操作的最終完成(或失敗)及其結(jié)果值的表示志珍,比傳統(tǒng)的回調(diào)函...
    nimw閱讀 26,893評(píng)論 0 4
  • 你不知道JS:異步 第三章:Promises 在第二章橙垢,我們指出了采用回調(diào)來表達(dá)異步和管理并發(fā)時(shí)的兩種主要不足:缺...
    purple_force閱讀 2,067評(píng)論 0 4