class MyPromise {
constructor (executor) {
this.state = 'pending'
this.value = this.reason = undefined
this.onFulfilledCallback = []
this.onRejectedCallback = []
try {
executor(this.resolve, this.reject)
} catch (error) {
this.reject(error)
}
}
resolve = value => {
if (this.state === 'pending') {
this.state = 'fulfilled'
this.value = value
this.onFulfilledCallback.forEach(cb => cb())
}
}
reject = reason => {
if (this.state === 'pending') {
this.state = 'rejected'
this.reason = reason
this.onRejectedCallback.forEach(cb => cb())
}
}
then = (onFulfilled, onRejected) => {
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : v => v
onRejected = typeof onRejected === 'function' ? onRejected : r => { throw r }
const promise2 = new MyPromise((resolve, reject) => {
if (this.state === 'fulfilled') {
setTimeout(() => {
try {
const x = onFulfilled(this.value)
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error)
}
}, 0)
}
if (this.state === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason)
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error)
}
}, 0)
}
if (this.state === 'pending') {
this.onFulfilledCallback.push(() => {
setTimeout(() => {
try {
const x = onFulfilled(this.value)
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error)
}
}, 0)
})
this.onRejectedCallback.push(() => {
setTimeout(() => {
try {
const x = onRejected(this.reason)
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error)
}
})
})
}
})
return promise2
}
catch = fn => this.then(void 0, fn)
}
MyPromise.resolve = value => new MyPromise(resolve => resolve(value))
MyPromise.reject = reason => new MyPromise((resolve, reject) => reject(reason))
MyPromise.race = fnArr => {
return new MyPromise((resolve, reject) => {
fnArr.forEach(fn => {
fn().then(resolve, reject)
})
})
}
MyPromise.all = fnArr => {
const result = []
const index = 0
return new MyPromise((resolve, reject) => {
fnArr.forEach((fn, i) => {
fn().then((v) => {
result[i] = v
index++
if (index === fnArr.length) {
resolve(result)
}
}, reject)
})
})
}
function resolvePromise (promise2, x, resolve, reject) {
if (x === promise2) {
reject(new TypeError('Chaining cycle detected for promise'))
}
// 鎖
let called
if (x != null && (typeof x === 'object' || typeof x === 'function')) {
try {
const then = x.then
if (typeof then === 'function') {
then.call(x, y => {
if (called) return
called = true
resolvePromise(promise2, y, resolve, reject)
}, err => {
if (called) return
called = true
reject(err)
})
} else {
resolve(x)
}
} catch (error) {
if (called) return
called = true
reject(error)
}
} else {
resolve(x)
}
}
手寫一個(gè)符合promise A+規(guī)范的promsie
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門勉痴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人树肃,你說(shuō)我怎么就攤上這事蒸矛。” “怎么了胸嘴?”我有些...
- 文/不壞的土叔 我叫張陵雏掠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我劣像,道長(zhǎng)乡话,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任耳奕,我火速辦了婚禮绑青,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屋群。我一直安慰自己闸婴,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布芍躏。 她就那樣靜靜地躺著邪乍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪对竣。 梳的紋絲不亂的頭發(fā)上庇楞,一...
- 那天,我揣著相機(jī)與錄音否纬,去河邊找鬼姐刁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烦味,可吹牛的內(nèi)容都是我干的聂使。 我是一名探鬼主播壁拉,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柏靶!你這毒婦竟也來(lái)了弃理?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咱揍,沒(méi)想到半個(gè)月后尘惧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡辆苔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扼劈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驻啤。...
- 正文 年R本政府宣布贼涩,位于F島的核電站,受9級(jí)特大地震影響薯蝎,放射性物質(zhì)發(fā)生泄漏遥倦。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一占锯、第九天 我趴在偏房一處隱蔽的房頂上張望谊迄。 院中可真熱鬧,春花似錦烟央、人聲如沸统诺。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粮呢。三九已至,卻和暖如春钞艇,著一層夾襖步出監(jiān)牢的瞬間啄寡,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓飘弧,卻偏偏與公主長(zhǎng)得像识藤,于是被迫代替她去往敵國(guó)和親砚著。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- Promise的基本概念: Promise使異步脫離了回調(diào)地獄痴昧,可以更優(yōu)雅的操作異步函數(shù)的執(zhí)行結(jié)果稽穆。究其根本,不過(guò)...
- 寫在前面 沒(méi)錯(cuò)赶撰,這又是一篇關(guān)于手寫 Promise 的文章舌镶,想必大家已經(jīng)看過(guò)很多相關(guān) Promise 的文章,關(guān)于...
- Promise 實(shí)現(xiàn)一個(gè)符合 Promise/A+ 規(guī)范的 MyPromise豪娜,并實(shí)現(xiàn) resolve餐胀、rejec...
- Promise本意是承諾,在程序中的意思就是承諾我過(guò)一段時(shí)間后會(huì)給你一個(gè)結(jié)果瘤载。 ES6 中采用了 Promise/...