[ECMAScript] Promise相關(guān)的幾個(gè)術(shù)語(yǔ)

1. fulfilled酒请,rejected甫恩,pending

A Promise is an object that is used as a placeholder for the eventual results of a deferred (and possibly asynchronous) computation.

Any Promise object is in one of three mutually exclusive states: fulfilled, rejected, and pending:

A promise p is fulfilled if p.then(f, r) will immediately enqueue a Job to call the function f.
A promise p is rejected if p.then(f, r) will immediately enqueue a Job to call the function r.
A promise is pending if it is neither fulfilled nor rejected.

一個(gè)promise總共有三種狀態(tài),pending榛斯,fulfilled/rejected,new Promise構(gòu)造函數(shù)創(chuàng)建的promise搂捧,初始處于pending狀態(tài)驮俗。

pending的時(shí)候不向Job Queue加入任何Job。

當(dāng)一個(gè)promise p被fulfilled/rejected的時(shí)候异旧,會(huì)立即向名字為PromiseJobs的Job Queue加入一個(gè)Job意述,這個(gè)Job做的事情就是調(diào)用p.then(f, r)中的f/r

2. settled吮蛹,resolved

A promise is said to be settled if it is not pending, i.e. if it is either fulfilled or rejected.

A promise is resolved if it is settled or if it has been “l(fā)ocked in” to match the state of another promise. Attempting to resolve or reject a resolved promise has no effect. A promise is unresolved if it is not resolved. An unresolved promise is always in the pending state. A resolved promise may be pending, fulfilled or rejected.

2.1 settled

一個(gè)promise被settled荤崇,指的是它脫離了pending狀態(tài),或者被fulfilled或者被rejected潮针。

2.2 resolved

resolve/reject一個(gè)promise术荤,
指的是調(diào)用new Promise((res,rej)=>{...})中的res/rej函數(shù)。

調(diào)用了res函數(shù)之后的promise每篷,稱(chēng)為resolved瓣戚。

2.3 如何理解“l(fā)ocked in”

A promise is resolved if it is settled or if it has been “l(fā)ocked in” to match the state of another promise.

要想理解“l(fā)ocked in”,首先要知道焦读,res函數(shù)可以接受三種類(lèi)型的值作為參數(shù)子库,
或者是一個(gè)promise,或者是一個(gè)帶有then方法的對(duì)象矗晃,或者是其他值仑嗅。

這里“l(fā)ocked in”指的是res接受promise,或者接受帶有then方法對(duì)象的情況,
這種方式進(jìn)行resolve仓技,會(huì)使得當(dāng)前的promise仍然處于pending狀態(tài)鸵贬,
其settled結(jié)果,與其參數(shù)對(duì)象的最終狀態(tài)有關(guān)脖捻。

例子:
(1)res的參數(shù)為promise的例子阔逼,

a = new Promise((res,rej)=>setTimeout(()=>res(1),1000));
b = new Promise((res,rej)=>res(a));

b.then(v=>console.log(v));

(2)res的參數(shù)為帶then方法的對(duì)象的例子,

a = {
  then:(res,rej)=>setTimeout(()=>res(1),1000)
};
b = new Promise((res,rej)=>res(a));

b.then(v=>console.log(v));

2.4 多次resolve無(wú)效

Attempting to resolve or reject a resolved promise has no effect.
一個(gè)promise一旦resolved地沮,再次resolve/reject將失效嗜浮。

無(wú)論第一次resolve所使用的參數(shù)是什么,
例如诉濒,即使第一調(diào)用res仍然使promise處于pending狀態(tài)周伦。

a = new Promise((res,rej)=>{
  res({
    then:(res,rej)=>setTimeout(()=>res(1),1000)
  });

  res(2);

  setTimeout(()=>rej(3),1000);
});

a.then(
  v => console.log(v),
  e => console.warn(e)
);

3. Enqueue Job

3.1 何時(shí)p.then(f, r)會(huì)Enqueue Job

如果promise p還沒(méi)有被settled,那么p.then(f, r)未荒,會(huì)將f/r放入promise的[[PromiseFulfillReactions]]/[[PromiseRejectReactions]]列表尾部专挪。

如果p已經(jīng)被settled,會(huì)向名為PromiseJobs的Job Queue中添加一個(gè)用來(lái)處理fulfilled/rejected的PromiseReactionJob片排。

因此寨腔,一個(gè)已經(jīng)settled的promise,每次調(diào)用p.then(f, r)會(huì)Enqueue Job率寡。
[[PromiseFulfillReactions]][[PromiseRejectReactions]]的作用是迫卢,當(dāng)promise處于pending狀態(tài)時(shí),保存p.then(f, r)所添加的處理器函數(shù)fr冶共。

3.2 使用res / rej Enqueue的兩種Job

res會(huì)出現(xiàn)在以下兩個(gè)地方:

(1)帶有then方法的對(duì)象中乾蛤,{then:(res,rej)=>{...}}
用一個(gè)帶有then方法的對(duì)象調(diào)用res,會(huì)向名為PromiseJobs的Job Queue中添加一個(gè)PromiseResolveThenableJob捅僵。

(2)new Promise((res,rej)=>{...})構(gòu)造函數(shù)中
調(diào)用res/rej家卖,會(huì)導(dǎo)致promise被settled,(只能被settle一次)
此時(shí)會(huì)清空promise的[[PromiseFulfillReactions]][[PromiseRejectReactions]]列表庙楚,并向名為PromiseJobs的Job Queue中添加一個(gè)用來(lái)處理fulfilled/rejected的 PromiseReactionJob上荡。

因此,調(diào)用res/rej總是會(huì)Enqueue Job馒闷。
當(dāng)promise被settled的時(shí)候酪捡,[[PromiseFulfillReactions]][[PromiseRejectReactions]]就沒(méi)有用了,因?yàn)閟ettled狀態(tài)的promise纳账,即使再添加處理器p.then(f, r)逛薇,也是直接Enqueue Job,和[[PromiseFulfillReactions]][[PromiseRejectReactions]]無(wú)關(guān)疏虫。

a = new Promise(res=>setTimeout(()=>res(1),1000));
a.then(v=>console.log(v));

setTimeout(()=>a.then(v=>console.warn(v)),2000);

參考

StackOverflow: What is the correct terminology for javascript promises
ECMAScript 2018 Language Specification

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末金刁,一起剝皮案震驚了整個(gè)濱河市帅涂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尤蛮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斯议,死亡現(xiàn)場(chǎng)離奇詭異产捞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)哼御,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)坯临,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人恋昼,你說(shuō)我怎么就攤上這事看靠。” “怎么了液肌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵挟炬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嗦哆,道長(zhǎng)谤祖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任老速,我火速辦了婚禮粥喜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橘券。我一直安慰自己额湘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布旁舰。 她就那樣靜靜地躺著锋华,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鬓梅。 梳的紋絲不亂的頭發(fā)上供置,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音绽快,去河邊找鬼芥丧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坊罢,可吹牛的內(nèi)容都是我干的续担。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼活孩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼物遇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤询兴,失蹤者是張志新(化名)和其女友劉穎乃沙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诗舰,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陋桂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年胆绊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞍恢,死狀恐怖抑进,靈堂內(nèi)的尸體忽然破棺而出茬末,到底是詐尸還是另有隱情候址,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布族扰,位于F島的核電站厌丑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏别伏。R本人自食惡果不足惜蹄衷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厘肮。 院中可真熱鬧愧口,春花似錦、人聲如沸类茂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巩检。三九已至厚骗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兢哭,已是汗流浹背领舰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迟螺,地道東北人冲秽。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矩父,于是被迫代替她去往敵國(guó)和親锉桑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 00攻柠、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大后裸。它由社區(qū)...
    夜幕小草閱讀 2,133評(píng)論 0 12
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器瑰钮,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語(yǔ)法上說(shuō)轻抱,Pr...
    雨飛飛雨閱讀 3,358評(píng)論 0 19
  • Promise的含義: ??Promise是異步編程的一種解決方案飞涂,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    呼呼哥閱讀 2,170評(píng)論 0 16
  • 一有暇,吳儂老師便在東太湖邊的東西山行走士八,拍下大量的精美作品容燕。她鏡頭里的紫金庵,禪意深深婚度,美不可言蘸秘。這次,...
    汾湖秀閱讀 1,163評(píng)論 3 4
  • 隨著業(yè)務(wù)線(xiàn)不斷擴(kuò)展蝗茁,我們希望項(xiàng)目能走模塊化路線(xiàn)醋虏。業(yè)務(wù)塊能分離成單獨(dú)的組件供宿主調(diào)用。本文源碼哮翘、體驗(yàn)apk下載地址h...
    紫闞閱讀 1,113評(píng)論 2 5