ES6(9)桃犬、Promise

Promise 對象用于表示一個異步操作的最終完成 (或失敗)及其結(jié)果值恋拍。

1隧土、在ES6之前:利用回調(diào)函數(shù)解決異步操作的問題
(1)提针、什么是回調(diào)函數(shù)

function B(){ A() }  
function A(){}
B(A)

在將函數(shù)A作為參數(shù)傳給函數(shù)B,等函數(shù)B執(zhí)行完次洼,然后調(diào)用函數(shù)A关贵,調(diào)用函數(shù)A的過程就是回調(diào)。

例子1:

function 獲取用戶信息(fn){
  fn('姓名:小明')
}
function 打印用戶信息(用戶信息){
  console.log('這是我打印出來的用戶信息')
  console.log(用戶信息)
}

獲取用戶信息(打印用戶信息)
打印結(jié)果

例子2:

回調(diào)地獄:在函數(shù)里面不斷有函數(shù)回調(diào)卖毁,容易導(dǎo)致參數(shù)不知道如何傳遞

function 獲取用戶信息(fn){
  fn('姓名:小明')
}

獲取用戶信息(function (用戶信息){
  console.log(用戶信息)
  保存用戶信息(用戶信息,function(){
      獲取另一個用戶的信息(function(另一個用戶信息){
       保存用戶信息
      })
  })
})

回調(diào)函數(shù)
缺點1:回調(diào)地獄
缺點2:不知道怎么使用 Node/jQuery

2、ES6:利用Promise解決回調(diào)地獄問題

function 獲取用戶信息(fn){
  return new Promise(function(resolve,reject){
    console.log('第1次獲取用戶信息中..')
    resolve('姓名小明')   //將參數(shù)傳遞給打印用戶信息
  })
}

function 打印用戶信息(用戶信息){
    return new Promise(function(resolve,reject){
    console.log(用戶信息)
    resolve()
  })
}

function 獲取另一個用戶信息(fn){
  return new Promise(function(resolve,reject){
    console.log('第2次獲取用戶信息中..')
    resolve('姓名小紅')
  })
}

獲取用戶信息()
  .then(打印用戶信息)
  .then(獲取另一個用戶信息)
  .then(打印用戶信息)
打印結(jié)果

(1)、如何理解Promise

1亥啦、new Promise()接受一個函數(shù)炭剪,函數(shù)參數(shù)必須包括resolvereject方法,其中resolve代表成功要執(zhí)行的翔脱,reject代表失敗要執(zhí)行的奴拦。
2、resolve(data)中data代表.then要傳入的數(shù)據(jù)届吁,reject(res)中res代表失敗的原因
3错妖、.then(fn1,fn2)接受兩個函數(shù)作為參數(shù)傳入,第一個函數(shù)是成功時候執(zhí)行疚沐,第二個是失敗時候執(zhí)行暂氯。
4、.then(fn1,fn2).then(fn3,fn4) 第一次.then亮蛔,如果成功痴施,則執(zhí)行fn1,失敗則執(zhí)行fn2究流;第二次.then如果fn1或fn2都順利執(zhí)行辣吃,并且fn1和fn2沒有報錯或者fn2中沒有reject(),或者fn2中沒有返回新的Promise芬探,則執(zhí)行fn3;否則執(zhí)行fn4神得。

  return new Promise(function(resolve,reject){
    console.log('第1次獲取用戶信息中..')
    resolve('姓名小明')
  })

例子1:(只有一個then情況)

function 獲取用戶信息(name){
  return new Promise(function(resolve,reject){
    if(name==='小明'){
      console.log('我認(rèn)識小明')
      resolve('小明是一個學(xué)生')
    }else{
      console.log('不認(rèn)識')
      reject()
    }
  })
}

例子1調(diào)試(1):

獲取用戶信息('小明')
  .then(
    function(d){console.log(d)},
    function(){console.log('它真的不認(rèn)識')}
   )
打印結(jié)果

例子1調(diào)試(2):

獲取用戶信息('小明')
  .then(
    function(d){console.log(d)},
    function(){console.log('它真的不認(rèn)識')}
   )
打印結(jié)果

例子2:(多個then情況)

function 獲取用戶信息(name){
  return new Promise(function(resolve,reject){
    if(name==='小明'){
     console.log('我認(rèn)識小明')
      resolve(['小明','是學(xué)生'])
    }else{
      console.log('不認(rèn)識')
      reject('不認(rèn)識')
    }
  })
}

function 獲取好友信息(name){
   console.log('獲取好友信息在執(zhí)行')
  return new Promise(function(resolve,reject){
    if(name==='小明'){
      resolve('張三、李四偷仿、王五')
    }else{
      reject()
    }
  })
}

function 打印信息(data){
    return new Promise(function(resolve,reject){
      console.log(data)
      resolve(data[0])
  })
}

function 打印失敗理由(res){
      console.log('失敗的理由是'+res)
      return Promise.reject('沒搞定') //我沒有搞定這個失敗兔甘,請后面的成功回調(diào)不要執(zhí)行
}

例子2調(diào)試1:

獲取用戶信息('小明')
  .then(打印信息,打印失敗理由)
  .then(獲取好友信息)
  .then(打印信息)
打印結(jié)果

例子2調(diào)試2:

獲取用戶信息('小紅')
  .then(打印信息,打印失敗理由)
  .then(獲取好友信息)
  .then(打印信息)
打印結(jié)果

(2)、結(jié)合await不要then就能拿到數(shù)據(jù)

將例子2調(diào)試1改成下面:

let 用戶信息= await 獲取用戶信息('小明')
console.log(用戶信息)
打印結(jié)果

將例子2調(diào)試2改成下面:

try{
  let 用戶信息= await 獲取用戶信息('小紅')
   console.log(用戶信息)
}catch(error){  //錯誤原因
  console.log('失敗理由是')
  console.log(error)
}
打印結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曼验,一起剝皮案震驚了整個濱河市勾拉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌形入,老刑警劉巖全跨,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亿遂,居然都是意外死亡浓若,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛇数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪钓,“玉大人,你說我怎么就攤上這事耳舅÷瞪希” “怎么了倚评?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馏予。 經(jīng)常有香客問我天梧,道長,這世上最難降的妖魔是什么霞丧? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任呢岗,我火速辦了婚禮,結(jié)果婚禮上蛹尝,老公的妹妹穿的比我還像新娘后豫。我一直安慰自己,他們只是感情好突那,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布挫酿。 她就那樣靜靜地躺著,像睡著了一般陨收。 火紅的嫁衣襯著肌膚如雪饭豹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天务漩,我揣著相機(jī)與錄音拄衰,去河邊找鬼。 笑死饵骨,一個胖子當(dāng)著我的面吹牛翘悉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播居触,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼妖混,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轮洋?” 一聲冷哼從身側(cè)響起制市,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弊予,沒想到半個月后祥楣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汉柒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年误褪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碾褂。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡兽间,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出正塌,到底是詐尸還是另有隱情嘀略,我是刑警寧澤恤溶,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站屎鳍,受9級特大地震影響宏娄,放射性物質(zhì)發(fā)生泄漏问裕。R本人自食惡果不足惜逮壁,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粮宛。 院中可真熱鬧窥淆,春花似錦、人聲如沸巍杈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筷畦。三九已至词裤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳖宾,已是汗流浹背吼砂。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鼎文,地道東北人渔肩。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像拇惋,于是被迫代替她去往敵國和親周偎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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