Javascript: Promise 學(xué)習(xí)筆記(1)

  1. 什么是 Promise 称近?
  2. Promise 解決了什么問題纯赎?
  3. 語法

一、什么是 Promise 励稳?

A Promise represents a proxy for a value not necessarily known when the promise is created. It allows you to associate handlers to an asynchronous action's eventual success value or failure reason. This lets asynchronous methods return values like synchronous methods: instead of the final value, the asynchronous method returns a promise of having a value at some point in the future

通俗點(diǎn)說就是佃乘,Promise 相當(dāng)于一個(gè)代理(proxy),用于處理 Promise 對象 的返回值驹尼,但這個(gè)值在 Promise 創(chuàng)建時(shí)不是必須知道的趣避,可以用于異步(asynchronous)操作的返回值,在以后需要返回的時(shí)候用一個(gè) Promise 封裝好這個(gè)返回值

二新翎、Promise 解決了什么問題 程帕?

首先來看個(gè)例子(例1)

// 路由處理
var route_1 = router.get('/example1', function(data) {
  process_1(data);
});
var route_2 = router.get('/example2', function(data) {
  process_2(data);
});
var route_3 = router.get('/example3', function(data) {
  process_3(data);
});

例1 這段代碼我們并不關(guān)心回調(diào)函數(shù)的執(zhí)行順序住练,所以代碼寫起來還是很清晰的

如果關(guān)心呢?那代碼將會寫成如下這樣(例2)

var route_1 = router.get('example1', function(data) {
  process_1(data);
  router_2 = router.get('example2', function(data) {
    process_2(data);
    router_3 = router.get('example3', function(data) {
      process_3(data);
    });
  });
});

例2 這段代碼是強(qiáng)調(diào)先后順序的愁拭,如果回調(diào)只有幾層還好讲逛,一旦多起來,誰都不愿意看

粘張圖感受一下回調(diào)的 **`威力`**

看完 例1 岭埠、例2盏混,我想大家大概知道為什么要有 Promise 的存在了

如果用 Promise 來實(shí)現(xiàn) 例2,代碼將如下(例3)

// 路由處理
var route_1 = function(resolve, reject) {
  router.get('example1', resolve(data));
};

var route_2 = function(resolve, reject) {
  router.get('example2', resolve(data));
};

var route_3 = function(resolve, reject) {
  router.get('example3', resolve(data));
};

// 相比于例2惜论,這里沒有了層層嵌套许赃,流程看起來也比較清晰
new Promise(route_1)
  .then(function(data) {
    process_1(data);
    return new Promise(route_2);
  })
  .then(function(data) {
    process_2(data);
    return new Promise(route_3)
  }).then(function(data) {
    process_3(data);
  });

因此,我認(rèn)為 Promise 存在的主要原因是為了應(yīng)對回調(diào)嵌套太深馆类,但應(yīng)該不僅局限于此

三图焰、語法

var promise = new Pormise(function(resolve, reject) {
  // ......
});

通過 new 關(guān)鍵字實(shí)例化一個(gè) Promise 對象,該對象接受一個(gè)函數(shù)參數(shù)蹦掐,接受兩個(gè)參數(shù)技羔,第一個(gè)參數(shù)用于處理執(zhí)行成功時(shí)的情景,第二個(gè)參數(shù)用于處理執(zhí)行失敗的情景

Promise 對象的狀態(tài)有三種

  1. pending:處理中
  2. fulfilled:處理成功
  3. rejected:處理失敗

Promise 對象原型包含兩個(gè)方法卧抗,then(onFulfilled, onRejected)catch(onRejected)

其中藤滥,then() 接受兩個(gè)參數(shù),第一個(gè)參數(shù)是在當(dāng)前 Promise resolve 時(shí)進(jìn)行回調(diào)的方法社裆,第二個(gè)參數(shù)是 reject 時(shí)進(jìn)行回調(diào)的方法拙绊;catch() 相當(dāng)于 then(undefined, onRejected) 的語法糖。調(diào)用 thencatch 之后都會反回一個(gè) Promise 對象泳秀,利用這個(gè)特性标沪,可以輕松地實(shí)現(xiàn)鏈?zhǔn)?chain)調(diào)用

需要注意的一點(diǎn)事,回調(diào)方法 onFulfilledonRejected 的返回值既可以是一個(gè) Promise 對象嗜傅,亦可以是其他值金句,比如

new Promise(step1)
  .then(function(data) {
    // ...
    return new Promise(step2);
  }).then(function(data) {
    //.. 
    return 1;
  }).then(function(data) {
    console.log(data);// 這里將輸出: 1
  });

關(guān)于 then 的實(shí)現(xiàn),可以參考 這里

Promise 實(shí)例包含四個(gè)方法吕嘀,分別是 all()违寞、race()reject()偶房、resolve()
將在下一篇文章進(jìn)行說明

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趁曼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棕洋,更是在濱河造成了極大的恐慌挡闰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摄悯,居然都是意外死亡赞季,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門射众,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碟摆,“玉大人晃财,你說我怎么就攤上這事叨橱。” “怎么了断盛?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵罗洗,是天一觀的道長。 經(jīng)常有香客問我钢猛,道長伙菜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任命迈,我火速辦了婚禮贩绕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壶愤。我一直安慰自己淑倾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布征椒。 她就那樣靜靜地躺著娇哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勃救。 梳的紋絲不亂的頭發(fā)上碍讨,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音蒙秒,去河邊找鬼勃黍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晕讲,可吹牛的內(nèi)容都是我干的溉躲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼益兄,長吁一口氣:“原來是場噩夢啊……” “哼锻梳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起净捅,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤疑枯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蛔六,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆永,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡废亭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了具钥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豆村。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骂删,靈堂內(nèi)的尸體忽然破棺而出掌动,到底是詐尸還是另有隱情,我是刑警寧澤宁玫,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布粗恢,位于F島的核電站,受9級特大地震影響欧瘪,放射性物質(zhì)發(fā)生泄漏眷射。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一佛掖、第九天 我趴在偏房一處隱蔽的房頂上張望妖碉。 院中可真熱鬧,春花似錦芥被、人聲如沸欧宜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鱼鸠。三九已至,卻和暖如春羹铅,著一層夾襖步出監(jiān)牢的瞬間蚀狰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工职员, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻蹋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓焊切,卻偏偏與公主長得像扮授,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子专肪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

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