Promise要點(diǎn)記錄

1.什么是Promise?
Promise是抽象異步處理對象以及對其進(jìn)行各種操作的組件。
2.三種類型
Constructor是其中一種:

Promise類似于 XMLHttpRequest,從構(gòu)造函數(shù) Promise 來創(chuàng)建一個新建新promise對象作為接口叁鉴。

要想創(chuàng)建一個promise對象承绸、可以使用new來調(diào)用Promise的構(gòu)造器來進(jìn)行實(shí)例化奋早。

var promise = new Promise(function(resolve, reject) {
    // 異步處理
    // 處理結(jié)束后兜粘、調(diào)用resolve 或 reject
});
//可以使用then,catch實(shí)例化:
成功resolve():
promise.then(onFulfilled, onRejected)
失敗reject()有兩種寫法绞绒,后者更直觀:
promise.then(undefined, onRejected)  == promise.catch(onRejected)

3.Promise創(chuàng)建和處理方法:

  • new Promise 方法創(chuàng)建promise對象

  • .then.catch 添加promise對象的處理函數(shù)

4.new Promise() 方法的快捷方式
靜態(tài)方法Promise.resolve(value) 可以認(rèn)為是 new Promise() 方法的快捷方式拦耐。

###比如 Promise.resolve(42); 可以認(rèn)為是以下代碼的語法糖耕腾。

new Promise(function(resolve){
    resolve(42);
});
###方法 Promise.resolve(value); 的返回值也是一個promise對象,所以我們可以像下面那樣接著對其返回值進(jìn)行 .then 調(diào)用杀糯。

Promise.resolve(42).then(function(value){
    console.log(value);
});

5.Promise方法鏈

aPromise.then(function taskA(value){
// task A
}).then(function taskB(vaue){
// task B
}).catch(function onRejected(error){
    console.log(error);
});
function taskA() {
    console.log("Task A");
}
function taskB() {
    console.log("Task B");
}
function onRejected(error) {
    console.log("Catch Error: A or B", error);
}
function finalTask() {
    console.log("Final Task");
}

var promise = Promise.resolve();
promise
    .then(taskA)
    .then(taskB)
    .catch(onRejected)
    .then(finalTask);
image.png

6.不管是 then 還是 catch 方法調(diào)用扫俺,都返回了一個新的promise對象。
6.1 我們說過 .catch 也可以理解為 promise.then(undefined, onRejected) 固翰。
then不能進(jìn)行錯誤處理的onRejected

function throwError(value) {
    // 拋出異常
    throw new Error(value);
}
// <1> onRejected不會被調(diào)用
function badMain(onRejected) {
    return Promise.resolve(42).then(throwError, onRejected);
}
// <2> 有異常發(fā)生時onRejected會被調(diào)用
function goodMain(onRejected) {
    return Promise.resolve(42).then(throwError).catch(onRejected);
}
// 運(yùn)行示例
badMain(function(){
    console.log("BAD");
});
goodMain(function(){
    console.log("GOOD");
});
在上面的代碼中狼纬, badMain 是一個不太好的實(shí)現(xiàn)方式(但也不是說它有多壞)羹呵, goodMain 則是一個能非常好的進(jìn)行錯誤處理的版本。
為什么說 badMain 不好呢疗琉?冈欢,因?yàn)殡m然我們在 .then 的第二個參數(shù)中指定了用來錯誤處理的函數(shù),但實(shí)際上它卻不能捕獲第一個參數(shù) onFulfilled 指定的函數(shù)(本例為 throwError )里面出現(xiàn)的錯誤盈简。
也就是說凑耻,這時候即使 throwError 拋出了異常,onRejected 指定的函數(shù)也不會被調(diào)用(即不會輸出"BAD"字樣)柠贤。
與此相對的是香浩, goodMain 的代碼則遵循了 throwError→onRejected 的調(diào)用流程。 這時候 throwError 中出現(xiàn)異常的話臼勉,在會被方法鏈中的下一個方法弃衍,即 .catch 所捕獲,進(jìn)行相應(yīng)的錯誤處理坚俗。
.then 方法中的onRejected參數(shù)所指定的回調(diào)函數(shù)镜盯,實(shí)際上針對的是其promise對象或者之前的promise對象,而不是針對 .then 方法里面指定的第一個參數(shù)猖败,即onFulfilled所指向的對象速缆,這也是 then 和 catch 表現(xiàn)不同的原因。

``

2.10.2. 總結(jié)

這里我們又學(xué)習(xí)到了如下一些內(nèi)容恩闻。

  1. 使用promise.then(onFulfilled, onRejected) 的話

    • onFulfilled 中發(fā)生異常的話艺糜,在 onRejected 中是捕獲不到這個異常的。
  2. promise.then(onFulfilled).catch(onRejected) 的情況下

    • then 中產(chǎn)生的異常能在 .catch 中捕獲
  3. .then.catch 在本質(zhì)上是沒有區(qū)別的

    • 需要分場合使用幢尚。

我們需要注意如果代碼類似 badMain 那樣的話破停,就可能出現(xiàn)程序不會按預(yù)期運(yùn)行的情況,從而不能正確的進(jìn)行錯誤處理尉剩。

7.使用 reject 會比使用 throw 安全
在 then 中使用reject的方法
8.then原理
在 then 中注冊的回調(diào)函數(shù)可以通過 return 返回一個值真慢,這個返回值會傳給后面的 then 或 catch 中的回調(diào)函數(shù)。

而且return的返回值類型不光是簡單的字面值理茎,還可以是復(fù)雜的對象類型黑界,比如promise對象等。
這時候皂林,如果返回的是promise對象的話朗鸠,那么根據(jù)這個promise對象的狀態(tài),在下一個 then 中注冊的回調(diào)函數(shù)中的onFulfilled和onRejected的哪一個會被調(diào)用也是能確定的础倍。

也許實(shí)際中我們可能不常使用 reject 烛占,但是比起來不假思索的使用 throw 來說,使用 reject 的好處還是很多的沟启。

var promise = Promise.resolve();
promise.then(function () {
    var retPromise = new Promise(function (resolve, reject) {
        // resolve or reject 的狀態(tài)決定 onFulfilled or onRejected 的哪個方法會被調(diào)用
    });
    return retPromise;
}).then(onFulfilled, onRejected);
###后面的then調(diào)用哪個回調(diào)函數(shù)是由promise對象的狀態(tài)來決定的

也就是說忆家,這個 retPromise 對象狀態(tài)為Rejected的時候犹菇,會調(diào)用后面then中的 onRejected 方法,這樣就實(shí)現(xiàn)了即使在 then 中不使用 throw 也能進(jìn)行reject處理了弦赖。

var onRejected = console.error.bind(console);
var promise = Promise.resolve();
promise.then(function () {
    var retPromise = new Promise(function (resolve, reject) {
       reject(new Error("this promise is rejected"));
    });
    return retPromise;
}).catch(onRejected);
//簡寫
var onRejected = console.error.bind(console);
var promise = Promise.resolve();
promise.then(function () {
    return Promise.reject(new Error("this promise is rejected"));
}).catch(onRejected);

推薦原文:http://liubin.org/promises-book/#promise-sequence

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末项栏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹬竖,更是在濱河造成了極大的恐慌沼沈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件币厕,死亡現(xiàn)場離奇詭異列另,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旦装,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門页衙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阴绢,你說我怎么就攤上這事店乐。” “怎么了呻袭?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵眨八,是天一觀的道長。 經(jīng)常有香客問我左电,道長廉侧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任篓足,我火速辦了婚禮段誊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栈拖。我一直安慰自己连舍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布辱魁。 她就那樣靜靜地躺著烟瞧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪染簇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天强岸,我揣著相機(jī)與錄音锻弓,去河邊找鬼。 笑死蝌箍,一個胖子當(dāng)著我的面吹牛青灼,可吹牛的內(nèi)容都是我干的暴心。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杂拨,長吁一口氣:“原來是場噩夢啊……” “哼专普!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弹沽,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檀夹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后策橘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炸渡,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年丽已,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚌堵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛婴,死狀恐怖吼畏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘁灯,我是刑警寧澤泻蚊,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站旁仿,受9級特大地震影響藕夫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枯冈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一毅贮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尘奏,春花似錦滩褥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俗孝,卻和暖如春酒甸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赋铝。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工插勤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓农尖,卻偏偏與公主長得像析恋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盛卡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355