面試官:談?wù)勀銓?duì)異步回調(diào)脉顿、promise、async/await的理解点寥?

promise的用法

Promise,簡(jiǎn)單來說就是一個(gè)容器艾疟,里面保存著某個(gè)未來才會(huì)結(jié)束的時(shí)間(通常是一個(gè)異步操作的結(jié)果)
Promise構(gòu)造函數(shù)接收一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)是resolve敢辩,reject蔽莱,它們由JavaScript引擎提供。其中resolve函數(shù)的作用是當(dāng)Promise對(duì)象轉(zhuǎn)移到成功,調(diào)用resolve并將操作結(jié)果作為其參數(shù)傳遞出去戚长;
reject函數(shù)的作用是單Promise對(duì)象的狀態(tài)變?yōu)槭r(shí)盗冷,將操作報(bào)出的錯(cuò)誤作為其參數(shù)傳遞出去。

 let p = new Promise((resolve,reject) => {
     resolve('success')
 });

Promise的then方法

promise的then方法帶有以下三個(gè)參數(shù):成功回調(diào)同廉,失敗回調(diào)仪糖,前進(jìn)回調(diào),一般情況下只需要實(shí)現(xiàn)第一個(gè)迫肖,后面是可選的锅劝。Promise中最為重要的是狀態(tài),通過then的狀態(tài)傳遞可以實(shí)現(xiàn)回調(diào)函數(shù)鏈?zhǔn)讲僮鞯膶?shí)現(xiàn)

 let p = new Promise((resolve,reject) => {
     resolve('success')
})
    
p.then(result => {
    console.log(result);
    //success
});

Promise的其他方法

catch用法

function myPromise(res){
  return new Promise((resolve,reject)=>{
      if(res.data){
          resolve("成功數(shù)據(jù)");
      }else{
          reject("失敗數(shù)據(jù)");
      }
  });
}

myPromise().then((message)=>{
    console.log(message);
  }
 )
.catch((message)=>{
    console.log(message);
})

這個(gè)時(shí)候catch執(zhí)行的是和reject一樣的咒程,也就是說如果Promise的狀態(tài)變?yōu)閞eject時(shí)鸠天,會(huì)被catch捕捉到,不過需要特別注意的是如果前面設(shè)置了reject方法的回調(diào)函數(shù)帐姻,·則catch不會(huì)捕捉到狀態(tài)變?yōu)閞eject的情況。catch還有一點(diǎn)不同的是奶段,如果在resolve或者reject發(fā)生錯(cuò)誤的時(shí)候饥瓷,會(huì)被catch捕捉到,這樣就能避免程序卡死在回調(diào)函數(shù)中了痹籍。

all用法

romise的all方法提供了并行執(zhí)行異步操作的能力呢铆,在all中所有異步操作結(jié)束后才執(zhí)行回調(diào)。

function p1(){
    return new Promise((resolve,reject)=>{
        resolve("p1完成");
    })
}

function p2(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
           resolve("p2完成")
        },2000);
    })
}

function p3(){
    return new Promise((resolve,reject)=>{
        resolve("p3完成")
    });;
}

Promise.all([p1(),p2(),p3()])
.then((data)=>{
    console.log(data);
})

這里可以看到p2的resolve放到一個(gè)setTimeout中蹲缠,最后的.then也會(huì)等到所有Promise完成狀態(tài)的改變后才執(zhí)行棺克。

race用法

在all中的回調(diào)函數(shù)中悠垛,等到所有的Promise都執(zhí)行完,再來執(zhí)行回調(diào)函數(shù)娜谊,race則不同它等到第一個(gè)Promise改變狀態(tài)就開始執(zhí)行回調(diào)函數(shù)确买。將上面的all改為race,得到

Promise.race([p1(),p2(),p3()])
.then(function(data){
    console.log(data);
})

async、await

異步編程的最高境界就是不關(guān)心它是否是異步纱皆。async湾趾、await很好的解決了這一點(diǎn),將異步強(qiáng)行轉(zhuǎn)換為同步處理派草。async/await與promise不存在誰代替誰的說法搀缠,因?yàn)閍sync/await是寄生于Promise,是Generater的語法糖近迁。

用法

async用于申明一個(gè)function是異步的艺普,而await可以認(rèn)為是async wait的簡(jiǎn)寫,等待一個(gè)異步方法執(zhí)行完成鉴竭。規(guī)則:
1 async和await是配對(duì)使用的歧譬,await存在于async的內(nèi)部。否則會(huì)報(bào)錯(cuò)
2 await表示在這里等待一個(gè)promise返回拓瞪,再接下來執(zhí)行
3 await后面跟著的應(yīng)該是一個(gè)promise對(duì)象缴罗,(也可以不是,如果不是接下來也沒什么意義了…)

寫法:

async function demo() {
 let result01 = await sleep(100);
 //上一個(gè)await執(zhí)行之后才會(huì)執(zhí)行下一句
 let result02 = await sleep(result01 + 100);
 let result03 = await sleep(result02 + 100);
 // console.log(result03);
  return result03;
}
demo().then(result => {
    console.log(result);
});`

錯(cuò)誤捕獲

let p = new Promise((resolve,reject) => {
    setTimeout(() => {
        reject('error');
    },1000);
});

async function demo(params) {
    try {
        let result = await p;
    }catch(e) {
       console.log(e);
    }
}

demo();

區(qū)別:

  1. promise是ES6祭埂,async/await是ES7
  2. async/await相對(duì)于promise來講面氓,寫法更加優(yōu)雅
  3. reject狀態(tài):
  • promise錯(cuò)誤可以通過catch來捕捉,建議尾部捕獲錯(cuò)誤蛆橡,
  • async/await既可以用.then又可以用try-catch捕捉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舌界,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泰演,更是在濱河造成了極大的恐慌呻拌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睦焕,死亡現(xiàn)場(chǎng)離奇詭異藐握,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垃喊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門猾普,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人本谜,你說我怎么就攤上這事初家。” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵溜在,是天一觀的道長(zhǎng)陌知。 經(jīng)常有香客問我,道長(zhǎng)掖肋,這世上最難降的妖魔是什么仆葡? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮培遵,結(jié)果婚禮上浙芙,老公的妹妹穿的比我還像新娘。我一直安慰自己籽腕,他們只是感情好嗡呼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皇耗,像睡著了一般南窗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郎楼,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天万伤,我揣著相機(jī)與錄音,去河邊找鬼呜袁。 笑死敌买,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阶界。 我是一名探鬼主播虹钮,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼膘融!你這毒婦竟也來了芙粱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤氧映,失蹤者是張志新(化名)和其女友劉穎春畔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛都,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡律姨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臼疫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线召。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖多矮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤塔逃,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布讯壶,位于F島的核電站,受9級(jí)特大地震影響湾盗,放射性物質(zhì)發(fā)生泄漏伏蚊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一格粪、第九天 我趴在偏房一處隱蔽的房頂上張望躏吊。 院中可真熱鬧,春花似錦帐萎、人聲如沸比伏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赁项。三九已至,卻和暖如春澈段,著一層夾襖步出監(jiān)牢的瞬間悠菜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工败富, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悔醋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓兽叮,卻偏偏與公主長(zhǎng)得像芬骄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子充择,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 今天感恩節(jié)哎德玫,感謝一直在我身邊的親朋好友。感恩相遇椎麦!感恩不離不棄宰僧。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,564評(píng)論 0 11
  • 彩排完观挎,天已黑
    劉凱書法閱讀 4,217評(píng)論 1 3
  • 表情是什么琴儿,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息嘁捷。高興了當(dāng)然就笑了造成,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,011評(píng)論 2 7