promise分享

一.為什么會出現(xiàn)promise

todo:回調(diào)地獄函數(shù)實例
比如我們要查找浙江省杭州市黎明縣東鄉(xiāng)鎮(zhèn)的豐田X系的車的價格嚎朽,我們可能得這么寫:

getSheng(){ // 獲取全國有哪些省
   if(res1.success){
       getShi('浙江省'){ // 獲取浙江省下面的市
         if(res2.success){
             getQu('杭州市'){ // 獲取杭州市下面的縣
               if(res3.success){
                 getZhen('黎明縣'){ // 獲取黎明縣下面的鎮(zhèn)
                   if(res4.success){
                       getBrand('東鄉(xiāng)鎮(zhèn)'){ // 獲取東鄉(xiāng)鎮(zhèn)里面有什么車
                         if(res5.success){
                             getChexi('豐田'){ // 獲取東豐田下的車系
                               if(res6.success){
                                 getPrice('X系列'){ // 獲取X系列的價格
                                   if(res7.success){
                                      console.log(res6.data.price)
                                 }
                              }
                           }
                         }
                       }
                     }
                   }
                }
             }
           }
         }
      }
   }
}

這樣的代碼看起來很煩吧,這還算是友好的嵌施,
這個是異步回調(diào)奈泪,還有跟多異步和同步代碼混合在一起,寫的時候一時爽佛析,維護代碼火葬場栗精,等需要改代碼的時候光理清他們的執(zhí)行順序可能就得耗費一片腦細胞闯参。但是在我們的代碼中經(jīng)常會寫出兩三層異步嵌套,各種同步異步混合的代碼悲立,就想問事情能變得簡單一點嗎鹿寨?

二. promise用法

當前可以,我們先用promise實現(xiàn)上面的功能

實現(xiàn)一下上面的函數(shù)

每一個promise都會提供一個then()函數(shù)薪夕,在這個then里面的函數(shù)脚草,我們可以做這些事情:
1.return另一個promise
2.return一個同步的值(或者undefined)
3.throw一個同步異常

promise寫法

Promise是一個構(gòu)造函數(shù),它接受一個函數(shù)作為參數(shù)原献,這個函數(shù)又有兩個參數(shù)分別為resolve和reject馏慨,這兩個參數(shù)也是函數(shù)。



resolve姑隅、reject

Promise是一種代碼結(jié)構(gòu)和流程写隶,類似于一個狀態(tài)機,有三種狀態(tài)讲仰,等待(pending)慕趴,成功(fulfilled),失敗(reject)--todo:吧resolve鄙陡,reject對應的函數(shù)用箭頭在圖上標出來冕房,方便理解--。成功趁矾,則執(zhí)行resolve耙册,失敗則執(zhí)行reject。一般情況下毫捣,你可以指定什么情況執(zhí)行resolve详拙,什么情況執(zhí)行reject。但如果程序執(zhí)行出現(xiàn)錯誤培漏,會直接執(zhí)行reject,如果找不到reject或者reject對應的函數(shù)胡本,程序會直接報錯牌柄。我們來幾個例子:

例子一:打印結(jié)果是啥?

  function fn1() {
    return new Promise(function(resolve, reject){
      setTimeout(() => {
        console.log('fn1')
      },1000)
    })
  }

  function fn2() {
    return new Promise(function(resolve, reject){
      setTimeout(() => {
        console.log('fn2')
      },2000)
    })
  }

fn1().then(fn2)

.then()是Promise實例的方法侧甫,它定義在原型對象(Promise.prototype)上. 接受兩個參數(shù)珊佣,這兩個參數(shù)都是函數(shù)蹋宦,第一個函數(shù)處理resolve(res),第二個函數(shù)處理reject(error);

例子二:打印結(jié)果是什么?

function fn1() {
    return new Promise(function(resolve, reject){
      setTimeout(() => {
        console.log('fn1')
        reject('錯誤'+'fn1')
      },1000)
    })
  }
  fn1().then(fn2)
const promise = new Promise(function(resolve, reject) {
  // 異步操作的代碼
  if(success) {
    return resolve(data); // data為異步操作成功返回的數(shù)據(jù)
  } else {
    return reject(error); //data為失敗時返回的數(shù)據(jù)
  }
})

2.ES6提供了一個原生的構(gòu)造函數(shù)Promise咒锻,promise用法

3.promise原理

promise本質(zhì)上是一個綁定了回調(diào)的對象冷冗,而不是將回調(diào)傳進函數(shù)內(nèi)部。惑艇?蒿辙??

promise的鏈式調(diào)用:

then函數(shù)會返回一個新的promise滨巴,跟原來的不同:

const promise = doSomething();
const promise2 = promise.then(successCallback, failureCallback);

為什么說promise是語法糖:
我們希望將例子一的寫法轉(zhuǎn)換成例子二的寫法:

  • 例子一
doSomething(function(value){
  console.log('Got a value'+value)
})
  • 例子二
doSomething().then(function(value){
  console.log('Got a value'+value)
})

如何實現(xiàn)上面的轉(zhuǎn)換呢思灌?

function doSomething(){
  return {
    then:function(callback){
      var value = 32;
      callback(value)
    }
  }
}

4.與Async等的對比

參考文檔:
https://juejin.im/entry/57513df25bbb5000642e95ba
https://juejin.im/post/5a730110f265da4e777f7792

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恭取,隨后出現(xiàn)的幾起案子泰偿,更是在濱河造成了極大的恐慌,老刑警劉巖蜈垮,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耗跛,死亡現(xiàn)場離奇詭異,居然都是意外死亡攒发,警方通過查閱死者的電腦和手機调塌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晨继,“玉大人烟阐,你說我怎么就攤上這事∥裳铮” “怎么了蜒茄?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長餐屎。 經(jīng)常有香客問我檀葛,道長,這世上最難降的妖魔是什么腹缩? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任屿聋,我火速辦了婚禮,結(jié)果婚禮上藏鹊,老公的妹妹穿的比我還像新娘润讥。我一直安慰自己,他們只是感情好盘寡,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布楚殿。 她就那樣靜靜地躺著,像睡著了一般竿痰。 火紅的嫁衣襯著肌膚如雪脆粥。 梳的紋絲不亂的頭發(fā)上砌溺,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音变隔,去河邊找鬼规伐。 笑死,一個胖子當著我的面吹牛匣缘,可吹牛的內(nèi)容都是我干的猖闪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼孵户,長吁一口氣:“原來是場噩夢啊……” “哼萧朝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夏哭,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤检柬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竖配,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體何址,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年进胯,在試婚紗的時候發(fā)現(xiàn)自己被綠了用爪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡胁镐,死狀恐怖偎血,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盯漂,我是刑警寧澤颇玷,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站就缆,受9級特大地震影響帖渠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竭宰,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一空郊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧切揭,春花似錦狞甚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春棺蛛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巩步。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工旁赊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椅野。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓终畅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竟闪。 傳聞我的和親對象是個殘疾皇子离福,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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