// promise 狀態(tài)
const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
const isFn = fn => typeof fn === 'function';
class Promise {
constructor(resolver) {
if (!isFn(resolver)) {
throw new TypeError('Promise 參數(shù)必須是函數(shù)');
}
//狀態(tài)和值
this._status = PENDING;
this._value;
//執(zhí)行隊(duì)列
this._fulfilledQueue = [];
this._rejectedQueue = [];
//綁定this
this._resolve = this._resolve.bind(this);
this._reject = this._reject.bind(this);
resolver(this._resolve, this._reject);
}
_resolve(val) {
if (this._status !== PENDING) return;
//因?yàn)镻romise里面的函數(shù)是同步的润绵,then是異步的
setTimeout(() => {
this._status = FULFILLED;
this._value = val;
let cb;
while (cb = this._fulfilledQueue.shift()) {
cb(this._value)
}
}, 0);
}
_reject(val) {
if (this._status !== PENDING) return;
//因?yàn)镻romise里面的函數(shù)是同步的胞谈,then是異步的
setTimeout(() => {
this._status = REJECTED;
this._value = val;
let cb;
while (cb = this._rejectedQueue.shift()) {
cb(this._value)
}
}, 0);
}
// then 參數(shù)類型:
//(1)值
//(2)函數(shù), 返回值或者Promise
then(onFulfilled, onRejected) {
return new Promise((resolve, reject) => {
// 返回一個(gè) resolve 或者 reject 函數(shù)
let runThen = (callback, resolver) => {
return function (val) {
try {
if (!isFn(callback)) { // 判斷 onFulfilled卿捎、onRejected 是否是一個(gè) function径密,否的話直接透?jìng)鱲alue
resolver(val)
} else {
const res = callback(val); // 判斷函數(shù)返回值是否是一個(gè) Promise
if (res instanceof Promise) {
res.then(resolve, reject);
} else {
resolver(res)
}
}
} catch (err) {
reject(err);
}
}
}
//判斷當(dāng)前的status
switch (this._status) {
case FULFILLED:
runThen(onFulfilled, resolve)(this._value);
break;
case REJECTED:
runThen(onRejected, reject)(this._value);
break;
case PENDING: //狀態(tài)未變享扔,將函數(shù)添加到執(zhí)行隊(duì)列,等待狀態(tài)改變后執(zhí)行
this._fulfilledQueue.push(runThen(onFulfilled, resolve));
this._rejectedQueue.push(runThen(onRejected, reject));
break;
}
});
}
static resolve(promise) {
// 判斷 promise 是否是一個(gè) promise 對(duì)象
if (promise instanceof Promise) {
return promise;
} else {
return new Promise(resolve => {
resolve(promise);
});
}
}
static reject(err){
return new Promise((resolve, reject) => reject(err));
}
catch(onRejected) {
return this.then(undefined, onRejected);
}
finally(callback) {
return this.then(
value => Promise.resolve(callback()).then(() => value),
reason => Promise.resolve(callback()).then(() => { throw reason })
);
}
static race(pmList) {
return new Promise((resolve, reject) => {
pmList.forEach(item => {
// item 可能不是 promise,所以先調(diào)用 promise.resolve
Promise.resolve(item).then(val => {
resolve(val);
}, err => {
reject(err);
});
})
})
}
static all(pmList) {
return new Promise((resolve, reject) => {
let resolveArr = [];
let count = 0;
pmList.forEach((item, index) => {
// item 可能不是 promise暮顺,所以先調(diào)用 promise.resolve
Promise.resolve(item).then(val => {
resolveArr[index] = val;
count++;
if (count === pmList.length) {
resolve(resolveArr);
}
}, err => {
reject(err);
});
})
})
}
}
Es6 Promise 實(shí)現(xiàn)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門安寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來首尼,“玉大人,你說我怎么就攤上這事迎捺〔榕牛” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵岖瑰,是天一觀的道長(zhǎng)锭环。 經(jīng)常有香客問我泊藕,道長(zhǎng)难礼,這世上最難降的妖魔是什么玫锋? 我笑而不...
- 正文 為了忘掉前任撩鹿,我火速辦了婚禮,結(jié)果婚禮上节沦,老公的妹妹穿的比我還像新娘。我一直安慰自己吼鳞,他們只是感情好叫搁,可當(dāng)我...
- 文/花漫 我一把揭開白布渴逻。 她就那樣靜靜地躺著,像睡著了一般雪位。 火紅的嫁衣襯著肌膚如雪梨撞。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼袍辞!你這毒婦竟也來了常摧?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溃斋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(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)容
- 實(shí)現(xiàn) Promise/A+ 規(guī)范 檢測(cè)通過 實(shí)現(xiàn) ES6 Promise 方法
- 一.Promise的含義和意義 1.什么是PromisePromise是抽象異步處理對(duì)象以及對(duì)其進(jìn)行各種操作的組件...
- 1. Promise A+ 規(guī)范 官方英文地址:https://promisesaplus.com/ 中文翻譯可參...
- 根據(jù)promise A+規(guī)范善延,實(shí)現(xiàn)一個(gè)簡(jiǎn)易promise需要考慮如下的問題: 1.狀態(tài):pending少态,resol...
- nojsja.gitee.io/blogs 更多內(nèi)容已經(jīng)在個(gè)人博客發(fā)布,請(qǐng)知悉 使用ES5手動(dòng)實(shí)現(xiàn)ES6中的Pro...