ES6 - Promise

基本概念

Promise 對象有三種狀態(tài):pending瀑梗,resolved,rejected
只有異步操作的結果,可以決定當前是哪一種狀態(tài)卵沉,任何其他操作都無法改變這個狀態(tài)
一旦狀態(tài)改變涉波,就不會再變珠闰,任何時候都可以得到這個結果
Promise 對象的狀態(tài)改變咬崔,只有兩種可能:從 pending 變?yōu)?fulfilled 狸棍,從 pending 變?yōu)?rejected

Promise.prototype.catch()

Promise.prototype.catch 方法是 .then(null, rejection) 的別名鉴扫,用于指定發(fā)生錯誤時的回調函數

p.then(() => {})
  .catch(() => {});

// 等同于
p.then(() => {})
  .then(null, () => {});

Promise 內部的錯誤不會影響到 Promise 外部的代碼

p = new Promise((resolve, reject) => {
  resolve(x + 1)
})
p.then(() => console.log(11))

setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123

Promise.prototype.finally()

用于指定不管 Promise 對象最后狀態(tài)如何赞枕,都會執(zhí)行的操作
其實是個語法糖:

promise.finally(() => {
  // 語句
});

// 等同于
promise.then(
  result => {
    // 語句
    return result;
  },
  error => {
    // 語句
    throw error;
  }
);

Promise.all()

用于將多個 Promise 實例,包裝成一個新的 Promise 實例,參數需要具有 Iterator 接口

const p = Promise.all([p1, p2, p3]);

p 的狀態(tài)由 p1炕婶、p2姐赡、p3 決定,分成兩種情況:
(1)只有 p1柠掂、p2项滑、p3 的狀態(tài)都變成 fulfilled,p的狀態(tài)才會變成 fulfilled陪踩,此時p1杖们、p2、p3的返回值組成一個數組肩狂,傳遞給p的回調函數摘完。
(2)只要 p1、p2傻谁、p3 之中有一個被 rejected孝治,p的狀態(tài)就變成 rejected,此時第一個被 reject 的實例的返回值审磁,會傳遞給p的回調函數谈飒。

Promise.race()

將多個 Promise 實例,包裝成一個新的 Promise 實例

const p = Promise.race([p1, p2, p3]);

上面代碼中态蒂,只要 p1杭措、p2、p3 之中有一個實例率先改變狀態(tài)钾恢,p 的狀態(tài)就跟著改變手素。那個率先改變的 Promise 實例的返回值,就傳遞給 p 的回調函數

Promise.resolve()

作用:將現(xiàn)有對象轉為 promise 對象
Promise.resolve 等價于下面的寫法

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

如果參數是 promise 實例瘩蚪,那么 Promise.resolve 將原封不動地返回這個實例泉懦。

注意:立即 resolve 的 Promise 對象,是在本輪“事件循環(huán)”(event loop)的結束時疹瘦,而不是在下一輪“事件循環(huán)”的開始時崩哩。

setTimeout(function () {
  console.log('three');
}, 0);

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three

Promise.reject()

作用:返回一個新的 Promise 實例,該實例的狀態(tài)為 rejected

const p = Promise.reject('出錯了');
// 等同于
const p = new Promise((resolve, reject) => reject('出錯了'))

p.then(null, function (s) {
  console.log(s)
});
// 出錯了

注意:Promise.reject() 方法的參數言沐,會原封不動地作為 reject 的理由邓嘹,變成后續(xù)方法的參數。這一點與 Promise.resolve 方法不一致险胰。

Promise.try()

Promise.try(database.users.get({id: userId}))
  .then(...)
  .catch(...)

給同步和異步提供統(tǒng)一的錯誤處理

其它

new Promise(() => { })吴超,這條語句執(zhí)行后,傳入的函數就會執(zhí)行鸯乃。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鲸阻,一起剝皮案震驚了整個濱河市跋涣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸟悴,老刑警劉巖陈辱,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異细诸,居然都是意外死亡沛贪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門震贵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來利赋,“玉大人,你說我怎么就攤上這事猩系∶乃停” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵寇甸,是天一觀的道長塘偎。 經常有香客問我,道長拿霉,這世上最難降的妖魔是什么吟秩? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮绽淘,結果婚禮上涵防,老公的妹妹穿的比我還像新娘。我一直安慰自己沪铭,他們只是感情好壮池,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伦意,像睡著了一般火窒。 火紅的嫁衣襯著肌膚如雪硼补。 梳的紋絲不亂的頭發(fā)上驮肉,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音已骇,去河邊找鬼离钝。 笑死,一個胖子當著我的面吹牛褪储,可吹牛的內容都是我干的卵渴。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼鲤竹,長吁一口氣:“原來是場噩夢啊……” “哼浪读!你這毒婦竟也來了昔榴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤碘橘,失蹤者是張志新(化名)和其女友劉穎互订,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體痘拆,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡仰禽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纺蛆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吐葵。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桥氏,靈堂內的尸體忽然破棺而出温峭,到底是詐尸還是另有隱情,我是刑警寧澤识颊,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布诚镰,位于F島的核電站,受9級特大地震影響祥款,放射性物質發(fā)生泄漏清笨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一刃跛、第九天 我趴在偏房一處隱蔽的房頂上張望抠艾。 院中可真熱鬧,春花似錦桨昙、人聲如沸检号。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐苛。三九已至,卻和暖如春桂塞,著一層夾襖步出監(jiān)牢的瞬間凹蜂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工阁危, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玛痊,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓狂打,卻偏偏與公主長得像擂煞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趴乡,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容

  • Promise的含義: ??Promise是異步編程的一種解決方案对省,比傳統(tǒng)的解決方案——回調函數和事件——更合理和...
    呼呼哥閱讀 2,172評論 0 16
  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案蝗拿,比傳統(tǒng)的解決方案——回調函...
    neromous閱讀 8,711評論 1 56
  • Promise含義 Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調函數和事件——更強大蒿涎。所謂Pr...
    oWSQo閱讀 1,086評論 0 4
  • 1. 首先創(chuàng)建Promise實例蛹磺,Promise實例生成以后,可以用then方法分別指定Resolved狀態(tài)和Re...
    竹溪穆褕閱讀 444評論 0 2
  • 一同仆、Promise的含義 Promise在JavaScript語言中早有實現(xiàn)萤捆,ES6將其寫進了語言標準,統(tǒng)一了用法...
    Alex灌湯貓閱讀 828評論 0 2