js--promise

1.含義
它由社區(qū)最早提出和實(shí)現(xiàn)贱案,ES6將其寫(xiě)進(jìn)了語(yǔ)言標(biāo)準(zhǔn)肛炮,統(tǒng)一了用法,原生提供了Promise對(duì)象侨糟。
所謂的Promise就是一容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束事件的結(jié)秕重。從語(yǔ)法上說(shuō),從它之中可以獲取異步操作的的消息菱魔。

特點(diǎn):
(1) 對(duì)象不受外界所干擾。
promise對(duì)象代表一個(gè)異步操作。它有三種狀態(tài)分別為Pending(進(jìn)行中)、Resolved(已完成雏节,又稱(chēng) Fulfilled)和Rejected(已失斒どぁ)。只有異步操作的結(jié)果钩乍,可以決定當(dāng)前是哪一種狀態(tài)变过,任何其他操作都無(wú)法改變這個(gè)狀態(tài)。這也是Promise這個(gè)名字的由來(lái)涝涤,它的英語(yǔ)意思就是“承諾”媚狰,表示其他手段無(wú)法改變。

(2) 狀態(tài)一旦確定就不會(huì)改變阔拳。
Promise對(duì)象的狀態(tài)改變崭孤,只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了裳瘪,不會(huì)再變了土浸,會(huì)一直保持這個(gè)結(jié)果。

缺點(diǎn):
首先彭羹,無(wú)法取消Promise黄伊,一旦新建它就會(huì)立即執(zhí)行,無(wú)法中途取消派殷。其次还最,如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤毡惜,不會(huì)反應(yīng)到外部拓轻。第三,當(dāng)處于Pending狀態(tài)時(shí)经伙,無(wú)法得知目前進(jìn)展到哪一個(gè)階段(剛剛開(kāi)始還是即將完成)扶叉。

  1. 用法
    Promise對(duì)象是一個(gè)構(gòu)造函數(shù),用來(lái)生成Promise實(shí)例帕膜。
var promise = new Promise(function (resolve, reject) {
  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
})

Promise實(shí)例生成以后枣氧,可以用then方法分別指定Resolved狀態(tài)和Reject狀態(tài)的回調(diào)函數(shù)。

promise.then(() =>{
   // success
}, () => {
  // failure
})

then方法可以接受兩個(gè)回調(diào)函數(shù)作為參數(shù)垮刹。第一個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)變?yōu)镽esolved時(shí)調(diào)用达吞,第二個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)變?yōu)镽eject時(shí)調(diào)用。其中荒典,第二個(gè)函數(shù)是可選的酪劫,不一定要提供。這兩個(gè)函數(shù)都接受Promise對(duì)象傳出的值作為參數(shù)寺董。

實(shí)例:

function timeout(ms) {
   return new Promise((resolve, reject) => {
      setTimeout(resolve, ms, 'done')
   })
}

timeout(100, then((value) => {
  console.log(value)
}))

上面代碼中覆糟,timeout方法返回一個(gè)Promise實(shí)例,表示一段時(shí)間以后才會(huì)發(fā)生的結(jié)果螃征。過(guò)了指定的時(shí)間(ms參數(shù))以后搪桂,Promise實(shí)例的狀態(tài)變?yōu)镽esolved,就會(huì)觸發(fā)then方法綁定的回調(diào)函數(shù)盯滚。

注意:Promise新建后就會(huì)立即執(zhí)行踢械。

  1. Promise.prototype.then()
    Promise實(shí)例具有then方法,也就是說(shuō)魄藕,then方法是定義在原型對(duì)象Promise.prototype上的内列。then方法返回的是一個(gè)新的Promise實(shí)例(注意,不是原來(lái)那個(gè)Promise實(shí)例)背率。因此可以采用鏈?zhǔn)綄?xiě)法话瞧,即then方法后面再調(diào)用另一個(gè)then方法嫩与。

4.promise.prototype.catch()
Promise.prototype.catch方法是.then(null, rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)交排。

  1. promise.all()
    Promise.all方法用于將多個(gè)Promise實(shí)例划滋,包裝成一個(gè)新的Promise實(shí)例.
    var p = Promise.all([p1, p2, p3])

6.Promise.race()
Promise.race方法同樣是將多個(gè)Promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例埃篓。

  1. promise.resolve()
    有時(shí)需要將現(xiàn)有對(duì)象轉(zhuǎn)為Promise對(duì)象处坪,Promise.resolve方法就起到這個(gè)作用。

Promise.resolve('foo')
// 等價(jià)于
new Promise(resolve => resolve('foo'))

  1. promise.reject()
    Promise.reject(reason)方法也會(huì)返回一個(gè)新的 Promise 實(shí)例架专,該實(shí)例的狀態(tài)為rejected同窘。

  2. promise.try()
    實(shí)際開(kāi)發(fā)中,經(jīng)常遇到一種情況:不知道或者不想?yún)^(qū)分部脚,函數(shù)f是同步函數(shù)還是異步操作想邦,但是想用 Promise 來(lái)處理它。因?yàn)檫@樣就可以不管f是否包含異步操作委刘,都用then方法指定下一步流程丧没,用catch方法處理f拋出的錯(cuò)誤。一般就會(huì)采用下面的寫(xiě)法钱雷。
    promise.resolve().then(f)

promise原理實(shí)現(xiàn)

  1. 構(gòu)造一個(gè)Promise實(shí)例需要給Promise構(gòu)造函數(shù)傳入一個(gè)函數(shù)骂铁。傳入的函數(shù)需要有兩個(gè)形參,兩個(gè)形參都是function類(lèi)型的參數(shù)罩抗。分別是resolve和reject
  2. Promise上還有then方法,then 方法就是用來(lái)指定Promise 對(duì)象的狀態(tài)改變時(shí)確定執(zhí)行的操作灿椅,resolve 時(shí)執(zhí)行第一個(gè)函數(shù)(onFulfilled)套蒂,reject時(shí)執(zhí)行第二個(gè)函數(shù)(onRejected)
  3. 當(dāng)狀態(tài)變?yōu)閞esolve時(shí)便不能再變?yōu)閞eject,反之同理茫蛹。
function Promise(executor) {
  const _this = this;
  _this.status = 'pending';
  _this.successValue = undefined;
  _this.failValue = undefined;

  function resolve(value) {
    if (_this.status === 'pending') {
      _this.status = 'resolved';
      _this.successValue = value;
    }
  }

  function reject(reason) {
    if (_this.status === 'reject') {
      _this.status = 'rejected';
      _this.failValue = 'reject'
    }
  }
  executor(resolve, reject);
}

Promise.prototype.then = function(onFailed, onRejected) {
  const _this = this;
  if (_this.status === 'resolved') {
    onFailed(_this.successValue)
  }
  if (_this.status === 'rejected') {
    onRejected(_this.failValue);
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末操刀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婴洼,更是在濱河造成了極大的恐慌骨坑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬采,死亡現(xiàn)場(chǎng)離奇詭異欢唾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)粉捻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)礁遣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肩刃,你說(shuō)我怎么就攤上這事祟霍⌒油罚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沸呐,是天一觀的道長(zhǎng)醇王。 經(jīng)常有香客問(wèn)我,道長(zhǎng)崭添,這世上最難降的妖魔是什么厦画? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮滥朱,結(jié)果婚禮上根暑,老公的妹妹穿的比我還像新娘。我一直安慰自己徙邻,他們只是感情好排嫌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缰犁,像睡著了一般淳地。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帅容,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天颇象,我揣著相機(jī)與錄音,去河邊找鬼并徘。 笑死遣钳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麦乞。 我是一名探鬼主播蕴茴,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姐直!你這毒婦竟也來(lái)了倦淀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤声畏,失蹤者是張志新(化名)和其女友劉穎撞叽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體插龄,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愿棋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辫狼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片初斑。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖膨处,靈堂內(nèi)的尸體忽然破棺而出见秤,到底是詐尸還是另有隱情砂竖,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布鹃答,位于F島的核電站乎澄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏测摔。R本人自食惡果不足惜置济,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锋八。 院中可真熱鬧浙于,春花似錦、人聲如沸挟纱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紊服。三九已至檀轨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欺嗤,已是汗流浹背参萄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煎饼,地道東北人讹挎。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腺占,于是被迫代替她去往敵國(guó)和親淤袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 一.為什么需要promise衰伯? 開(kāi)發(fā)網(wǎng)站的過(guò)程中,我們經(jīng)常遇到某些耗時(shí)很長(zhǎng)的javascript操作积蔚。其中意鲸,既有異...
    overflow_hidden閱讀 12,426評(píng)論 2 21
  • 00怎顾、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大漱贱。它由社區(qū)...
    夜幕小草閱讀 2,133評(píng)論 0 12
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器槐雾,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語(yǔ)法上說(shuō)幅狮,Pr...
    雨飛飛雨閱讀 3,358評(píng)論 0 19
  • 本文適用的讀者 本文寫(xiě)給有一定Promise使用經(jīng)驗(yàn)的人募强,如果你還沒(méi)有使用過(guò)Promise株灸,這篇文章可能不適合你,...
    HZ充電大喵閱讀 7,305評(píng)論 6 19
  • 生活擎值,也就是人生的一盞明亮的燈慌烧,也是生命的源泉。人們常常說(shuō)生活的“ 酸鸠儿、甜屹蚊、苦、辣 ”进每,我覺(jué)得這個(gè)人形容...
    陽(yáng)光姐姐賈欣宜閱讀 148評(píng)論 0 0