Promise用法

Promise

狀態(tài)

pending: 初始狀態(tài), 非 fulfilled 或 rejected.

fulfilled: 成功的操作.

rejected: 失敗的操作.

基本用法

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

then()

它的作用是為 Promise 實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)。前面說(shuō)過(guò)巫糙,then方法的第一個(gè)參數(shù)是resolved狀態(tài)的回調(diào)函數(shù)朗儒,第二個(gè)參數(shù)(可選)是rejected狀態(tài)的回調(diào)函數(shù)。

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function funcA(comments) {
  console.log("resolved: ", comments);
}, function funcB(err){
  console.log("rejected: ", err);
});

then方法返回的是一個(gè)新的Promise實(shí)例(注意参淹,不是原來(lái)那個(gè)Promise實(shí)例)醉锄。因此可以采用鏈?zhǔn)綄懛ǎ磘hen方法后面再調(diào)用另一個(gè)then方法浙值。

catch()

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

getJSON('/posts.json').then(function(posts) {
  // ...
}).catch(function(error) {
  // 處理 getJSON 和 前一個(gè)回調(diào)函數(shù)運(yùn)行時(shí)發(fā)生的錯(cuò)誤
  console.log('發(fā)生錯(cuò)誤开呐!', error);
});

finally()

finally方法用于指定不管 Promise 對(duì)象最后狀態(tài)如何烟勋,都會(huì)執(zhí)行的操作。

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

all()

Promise.all方法用于將多個(gè) Promise 實(shí)例筐付,包裝成一個(gè)新的 Promise 實(shí)例卵惦。

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

上面代碼中,Promise.all方法接受一個(gè)數(shù)組作為參數(shù)瓦戚,p1沮尿、p2、p3都是 Promise 實(shí)例较解,如果不是畜疾,就會(huì)先調(diào)用下面講到的Promise.resolve方法赴邻,將參數(shù)轉(zhuǎn)為 Promise 實(shí)例,再進(jìn)一步處理庸疾。(Promise.all方法的參數(shù)可以不是數(shù)組乍楚,但必須具有 Iterator 接口当编,且返回的每個(gè)成員都是 Promise 實(shí)例届慈。)
p的狀態(tài)由p1、p2忿偷、p3決定金顿,分成兩種情況。

  • (1)只有p1鲤桥、p2揍拆、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled茶凳,此時(shí)p1嫂拴、p2、p3的返回值組成一個(gè)數(shù)組贮喧,傳遞給p的回調(diào)函數(shù)筒狠。
  • (2)只要p1、p2箱沦、p3之中有一個(gè)被rejected辩恼,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值谓形,會(huì)傳遞給p的回調(diào)函數(shù)灶伊。
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
  return getJSON('/post/' + id + ".json");
});

Promise.all(promises).then(function (posts) {
  // ...
}).catch(function(reason){
  // ...
});

race()

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

上面代碼中,只要p1寒跳、p2聘萨、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變童太。那個(gè)率先改變的 Promise 實(shí)例的返回值米辐,就傳遞給p的回調(diào)函數(shù)。

resolve()

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

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

reject()

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

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

p.then(null, function (s) {
  console.log(s)
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末择膝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子检激,更是在濱河造成了極大的恐慌肴捉,老刑警劉巖腹侣,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異齿穗,居然都是意外死亡傲隶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門窃页,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跺株,“玉大人,你說(shuō)我怎么就攤上這事脖卖∑故。” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵畦木,是天一觀的道長(zhǎng)袖扛。 經(jīng)常有香客問我,道長(zhǎng)十籍,這世上最難降的妖魔是什么蛆封? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮勾栗,結(jié)果婚禮上惨篱,老公的妹妹穿的比我還像新娘。我一直安慰自己械姻,他們只是感情好妒蛇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楷拳,像睡著了一般绣夺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欢揖,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天陶耍,我揣著相機(jī)與錄音,去河邊找鬼她混。 笑死烈钞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坤按。 我是一名探鬼主播毯欣,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼臭脓!你這毒婦竟也來(lái)了酗钞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砚作,沒想到半個(gè)月后窘奏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葫录,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年着裹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米同。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骇扇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窍霞,到底是詐尸還是另有隱情匠题,我是刑警寧澤拯坟,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布但金,位于F島的核電站,受9級(jí)特大地震影響郁季,放射性物質(zhì)發(fā)生泄漏冷溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一梦裂、第九天 我趴在偏房一處隱蔽的房頂上張望似枕。 院中可真熱鬧,春花似錦年柠、人聲如沸凿歼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)答憔。三九已至,卻和暖如春掀抹,著一層夾襖步出監(jiān)牢的瞬間虐拓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工傲武, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓉驹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓揪利,卻偏偏與公主長(zhǎng)得像态兴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疟位,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案瞻润,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,706評(píng)論 1 56
  • 一、Promise的含義 Promise在JavaScript語(yǔ)言中早有實(shí)現(xiàn),ES6將其寫進(jìn)了語(yǔ)言標(biāo)準(zhǔn)敢订,統(tǒng)一了用法...
    Alex灌湯貓閱讀 824評(píng)論 0 2
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,494評(píng)論 0 8
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器王污,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語(yǔ)法上說(shuō)楚午,Pr...
    雨飛飛雨閱讀 3,358評(píng)論 0 19
  • 1. Promise 的含義 所謂Promise昭齐,簡(jiǎn)單說(shuō)就是一個(gè)容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)...
    ROBIN2015閱讀 497評(píng)論 0 0