Promise ——異步編程統(tǒng)一方案

雖然回調(diào)函數(shù)是所有異步編程方案的根基驶悟;但是如果我們直接使用傳統(tǒng)回調(diào)方式去完成復(fù)雜的異步流程疆虚,就會(huì)無(wú)法避免大量的回調(diào)函數(shù)嵌套仁连;導(dǎo)致回調(diào)地獄的問(wèn)題。
為了避免這個(gè)問(wèn)題滑频。CommonJS社區(qū)提出了Promise的規(guī)范捡偏,ES6中稱為語(yǔ)言規(guī)范。

MDN:Promise
Promise 對(duì)象用于表示一個(gè)異步操作的最終完成 (或失敗)及其結(jié)果值峡迷。
一個(gè) Promise 必然處于以下幾種狀態(tài)之一:
待定(pending): 初始狀態(tài)银伟,既沒(méi)有被兌現(xiàn),也沒(méi)有被拒絕绘搞。
已兌現(xiàn)(fulfilled): 意味著操作成功完成彤避。
已拒絕(rejected): 意味著操作失敗。


基本用法

已兌現(xiàn)(fulfilled):

const promise = new Promise((resolve, reject) => {
  resolve(1)
})
promise.then((value) => {
  console.log('resolved', value) // resolve 1
},(error) => {
  console.log('rejected', error)
})

已拒絕(rejected):

const promise = new Promise((resolve, reject) => {
  reject('失敗了')
})
promise.then((value) => {
  console.log('resolved', value)
},(error) => {
  console.log('rejected', error)  // rejected 失敗了
})

即便promise中沒(méi)有任何的異步操作夯辖,then方法的回調(diào)函數(shù)仍然會(huì)進(jìn)入到事件隊(duì)列中排隊(duì)琉预。
Promise的本質(zhì)上也是使用回調(diào)函數(shù)的方式去定義異步任務(wù)結(jié)束后所需要執(zhí)行的任務(wù)。這里的回調(diào)函數(shù)是通過(guò)then方法傳遞過(guò)去的


鏈?zhǔn)秸{(diào)用

  • promise對(duì)象then方法蒿褂,返回了全新的promise對(duì)象圆米∽湓荩可以再繼續(xù)調(diào)用then方法,如果return的不是promise對(duì)象娄帖,而是一個(gè)值也祠,那么這個(gè)值會(huì)作為resolve的值傳遞,如果沒(méi)有值近速,默認(rèn)是undefined
  • 后面的then方法就是在為上一個(gè)then返回的Promise注冊(cè)回調(diào)
  • 前面then方法中回調(diào)函數(shù)的返回值會(huì)作為后面then方法回調(diào)的參數(shù)
  • 如果回調(diào)中返回的是Promise诈嘿,那后面then方法的回調(diào)會(huì)等待它的結(jié)束

異常處理

  1. then的第二個(gè)參數(shù)onRejected方法
  2. catch()
    兩者的區(qū)別:
    catch是給整個(gè)promise鏈條注冊(cè)的一個(gè)失敗回調(diào);
    而then的第二個(gè)參數(shù)onRejected方法削葱,只能捕獲第一個(gè)promise的報(bào)錯(cuò)奖亚,如果當(dāng)前then的resolve函數(shù)處理中有報(bào)錯(cuò)是捕獲不到的。

    使用.catch方法更為常見(jiàn)析砸,因?yàn)楦臃湘準(zhǔn)秸{(diào)用
ajax('/api/user.json')
  .then(function onFulfilled(res) {
    console.log('onFulfilled', res)
  }).catch(function onRejected(error) {
    console.log('onRejected', error)
  })

等價(jià)于

ajax('/api/user.json')
  .then(function onFulfilled(res) {
    console.log('onFulfilled', res)
  })
  .then(undefined, function onRejected(error) {
    console.log('onRejected', error)
  })

常用的靜態(tài)方法

  • Promise.resolve()
  • Promise.reject()
  • Promise.all()
  • Promise.race()

Promise案例

function ajax (url) {
  return new Promise((resolve, rejects) => {
    // 創(chuàng)建一個(gè)XMLHttpRequest對(duì)象去發(fā)送一個(gè)請(qǐng)求
    const xhr = new XMLHttpRequest()
    // 先設(shè)置一下xhr對(duì)象的請(qǐng)求方式是GET昔字,請(qǐng)求的地址就是參數(shù)傳遞的url
    xhr.open('GET', url)
    // 設(shè)置返回的類型是json,是HTML5的新特性
    // 我們?cè)谡?qǐng)求之后拿到的是json對(duì)象干厚,而不是字符串
    xhr.responseType = 'json'
    // html5中提供的新事件,請(qǐng)求完成之后(readyState為4)才會(huì)執(zhí)行
    xhr.onload = () => {
      if(this.status === 200) {
        // 請(qǐng)求成功將請(qǐng)求結(jié)果返回
        resolve(this.response)
      } else {
        // 請(qǐng)求失敗李滴,創(chuàng)建一個(gè)錯(cuò)誤對(duì)象,返回錯(cuò)誤文本
        rejects(new Error(this.statusText))
      }
    }
    // 開(kāi)始執(zhí)行異步請(qǐng)求
    xhr.send()
  })
}

ajax('/api/user.json').then((res) => {
  console.log(res)
}, (error) => {
  console.log(error)
})

======================分割線======================
關(guān)于Promise源碼分析可以看另外一篇:Promise手寫(xiě)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛮瞄,一起剝皮案震驚了整個(gè)濱河市所坯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挂捅,老刑警劉巖芹助,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闲先,居然都是意外死亡状土,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門伺糠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒙谓,“玉大人,你說(shuō)我怎么就攤上這事训桶±弁裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵舵揭,是天一觀的道長(zhǎng)谤专。 經(jīng)常有香客問(wèn)我,道長(zhǎng)午绳,這世上最難降的妖魔是什么置侍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蜡坊,老公的妹妹穿的比我還像新娘杠输。我一直安慰自己,他們只是感情好秕衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布抬伺。 她就那樣靜靜地躺著,像睡著了一般灾梦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妓笙,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天若河,我揣著相機(jī)與錄音,去河邊找鬼寞宫。 笑死萧福,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辈赋。 我是一名探鬼主播鲫忍,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钥屈!你這毒婦竟也來(lái)了悟民?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤篷就,失蹤者是張志新(化名)和其女友劉穎射亏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竭业,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡智润,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了未辆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窟绷。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咐柜,靈堂內(nèi)的尸體忽然破棺而出兼蜈,到底是詐尸還是另有隱情,我是刑警寧澤炕桨,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布饭尝,位于F島的核電站,受9級(jí)特大地震影響献宫,放射性物質(zhì)發(fā)生泄漏钥平。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涉瘾。 院中可真熱鬧知态,春花似錦、人聲如沸立叛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秘蛇。三九已至其做,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赁还,已是汗流浹背妖泄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艘策,地道東北人蹈胡。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朋蔫,于是被迫代替她去往敵國(guó)和親罚渐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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