[MDN]筆記:Promise

本文就是從MDN中copy的,僅為了自己復習方便浓瞪。

1、 executor

new Promise( function(resolve, reject) {...} /* executor */  );

executor是帶有 resolvereject兩個參數(shù)的函數(shù) 。Promise構造函數(shù)執(zhí)行時立即調用executor 函數(shù)褐健, resolve 和 reject 兩個函數(shù)作為參數(shù)傳遞給executor(executor 函數(shù)在Promise構造函數(shù)返回所建promise實例對象前被調用)。
resolve和 reject函數(shù)被調用時澜汤,分別將promise的狀態(tài)改為fulfilled(完成)或rejected(失斞裂浮)。executor 內部通常會執(zhí)行一些異步操作俊抵,一旦異步操作執(zhí)行完畢(可能成功/失敗)谁不,要么調用resolve函數(shù)來將promise狀態(tài)改成fulfilled,要么調用reject 函數(shù)將promise的狀態(tài)改為rejected务蝠。如果在executor函數(shù)中拋出一個錯誤拍谐,那么該promise 狀態(tài)為rejected。executor函數(shù)的返回值被忽略馏段。
(resolve和reject函數(shù)是promise內部自己提供的)

function myAsyncFunction(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.onload = () => resolve(xhr.responseText);
    xhr.onerror = () => reject(xhr.statusText);
    xhr.send();
  });
};

2轩拨、Promise

Promise 對象是一個代理對象(代理一個值),被代理的值在Promise對象創(chuàng)建時可能是未知的院喜。它允許你為異步操作的成功和失敗分別綁定相應的處理方法(handlers)亡蓉。 這讓異步方法可以像同步方法那樣返回值,但并不是立即返回最終執(zhí)行結果喷舀,而是一個能代表未來出現(xiàn)的結果的promise對象砍濒。
一個 Promise有以下幾種狀態(tài):

  • pending: 初始狀態(tài),既不是成功硫麻,也不是失敗狀態(tài)爸邢。
  • fulfilled: 意味著操作成功完成。
  • rejected: 意味著操作失敗拿愧。
    pending 狀態(tài)的 Promise 對象可能會變?yōu)閒ulfilled 狀態(tài)并傳遞一個值給相應的狀態(tài)處理方法杠河,也可能變?yōu)槭顟B(tài)(rejected)并傳遞失敗信息。當其中任一種情況出現(xiàn)時,Promise 對象的 then 方法綁定的處理方法(handlers )就會被調用.

3券敌、 Promise.prototype

三者都會返回一個新的Promise卑雁。

4募书、方法

4.1 Promise.resolve(value)

如果參數(shù)value是一個Promise對象,則直接返回這個Promise對象序厉。如果不是轉化為value.

4.2 Promise.reject()

返回一個帶有拒絕原因的Promise對象锐膜。

4.3 Promise.all()

返回一個 Promise對象用于表示一個異步操作的最終完成 (或失敗), 及其結果值.") 實例,此實例在 iterable 參數(shù)內所有的 promise 都“完成(resolved)”或參數(shù)中不包含 promise 時回調完成(resolve)弛房;如果參數(shù)中 promise 有一個失數勒怠(rejected),此實例回調失斘拇贰(reject)荷逞,失敗原因的是第一個失敗 promise 的結果。

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});

實現(xiàn):

/ 添加靜態(tài)all方法
function all (list) {
  return new Promise((resolve, reject) => {
    //返回每個Promise值的集合
    let values = []
    let count = 0
    for (let [i, p] of list.entries()) {返回一個解析過帶著給定值的Promise對象粹排,如果參數(shù)是一個Promise對象种远,則直接返回這個Promise對象。
      // 數(shù)組參數(shù)如果不是Promise實例顽耳,先調用Promise.resolve
      Promise.resolve(p).then(res => {
                                                    values[i] = res
                                                    count++
                                                      // 所有狀態(tài)都變成fulfilled時返回的Promise狀態(tài)就變成fulfilled
                                                   if (count === list.length) resolve(values)
                                            }, err => {  // 有一個被rejected時返回的MyPromise狀態(tài)就變成rejected                        
                                                     reject(err)
                                           })
    }
  })
}

4.4 Promise.race(iterable)

Promise.race(iterable) 方法返回一個 promise坠敷,一旦迭代器中的某個promise解決或拒絕,返回的 promise就會解決或拒絕射富。

function race(list){  //實現(xiàn)race
    return new Promise( (resolve, reject) =>{
         int count = 0;
        for (let [i, p] of list.entries()) { //返回一個解析過帶著給定值的Promise對象膝迎,如果參數(shù)是一個Promise對象,則直接返回這個Promise對象胰耗。
            Promise.resolve(p).then((res) =>{
                                                     resolve(res);
                                           }, (err) = >{
                                                  reject(err);
          })
        }
   }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末限次,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柴灯,更是在濱河造成了極大的恐慌卖漫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赠群,死亡現(xiàn)場離奇詭異羊始,居然都是意外死亡,警方通過查閱死者的電腦和手機查描,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門店枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來速警,“玉大人叹誉,你說我怎么就攤上這事鸯两。” “怎么了长豁?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵钧唐,是天一觀的道長。 經常有香客問我匠襟,道長钝侠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任酸舍,我火速辦了婚禮帅韧,結果婚禮上,老公的妹妹穿的比我還像新娘啃勉。我一直安慰自己忽舟,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布淮阐。 她就那樣靜靜地躺著叮阅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泣特。 梳的紋絲不亂的頭發(fā)上浩姥,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音状您,去河邊找鬼勒叠。 笑死,一個胖子當著我的面吹牛膏孟,可吹牛的內容都是我干的眯分。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骆莹,長吁一口氣:“原來是場噩夢啊……” “哼颗搂!你這毒婦竟也來了?” 一聲冷哼從身側響起幕垦,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丢氢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后先改,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疚察,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年仇奶,在試婚紗的時候發(fā)現(xiàn)自己被綠了貌嫡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岛抄,靈堂內的尸體忽然破棺而出别惦,到底是詐尸還是另有隱情,我是刑警寧澤夫椭,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布掸掸,位于F島的核電站,受9級特大地震影響蹭秋,放射性物質發(fā)生泄漏扰付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一仁讨、第九天 我趴在偏房一處隱蔽的房頂上張望羽莺。 院中可真熱鬧,春花似錦洞豁、人聲如沸盐固。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闰挡。三九已至,卻和暖如春礁哄,著一層夾襖步出監(jiān)牢的瞬間长酗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工桐绒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夺脾,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓茉继,卻偏偏與公主長得像咧叭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烁竭,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • (稻盛哲學學習會)打卡第47天 姓名:邱露 部門:待定 誦讀《京瓷哲學》第一章“度過美好的人生” 2.精益求精 2...
    納尼名字已被占用閱讀 148評論 0 0
  • 茶在古代不僅是日常生活菲茬、俗務與精神都離不開之物,也是使人變得優(yōu)雅派撕、生活變得美好的“藝術”婉弹。 最喜歡綠茶的清香看著那...
    滇西1944閱讀 517評論 2 6
  • 愛情和婚姻,是千百年來亙古不變的話題终吼。我們聽到的愛情多半是美好的镀赌,即便是不能在一起的兩個人的愛情也常常會傳為佳話,...
    木子可可閱讀 450評論 0 1
  • 早上起來去修車际跪、更改健身卡商佛,從武漢回宜昌喉钢,好累睡了一覺,起來陪朋友一起吃晚飯良姆,介紹一個搞建筑的人認識肠虽,身家?guī)讉€億但...
    董銀超閱讀 193評論 0 0