const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
class AjPromise {
constructor(fn) {
this.state = PENDING;
this.value = null;
this.reason = null;
this.onFulfilledCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = value => {
if (value instanceof Promise) {
return value.then(resolve, reject);
}
setTimeout(() => {
if (this.state === PENDING) {
this.state = FULFILLED;
this.value = value;
this.onFulfilledCallbacks.map(cb => {
cb = cb(this.value);
});
}
});
};
const reject = reason => {
setTimeout(() => {
if (this.state === PENDING) {
this.state = REJECTED;
this.reason = reason;
this.onRejectedCallbacks.map(cb => {
cb = cb(this.reason);
});
}
});
};
try {
fn(resolve, reject);
} catch (e) {
reject(e);
}
}
then(onFulfilled, onRejected) {
let newPromise;
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value;
onRejected =
typeof onRejected === 'function'
? onRejected
: reason => {
throw reason;
};
if (this.state === FULFILLED) {
return (newPromise = new AjPromise((resolve, reject) => {
setTimeout(() => {
try {
let x = onFulfilled(this.value);
resolvePromise(newPromise, x, resolve, reject);
} catch (e) {
reject(e);
}
});
}));
}
if (this.state === REJECTED) {
return (newPromise = new AjPromise((resolve, reject) => {
setTimeout(() => {
try {
let x = onRejected(this.reason);
resolvePromise(newPromise, x, resolve, reject);
} catch (e) {
reject(e);
}
});
}));
}
if (this.state === PENDING) {
return (newPromise = new AjPromise((resolve, reject) => {
this.onFulfilledCallbacks.push(value => {
try {
let x = onFulfilled(value);
resolvePromise(newPromise, x, resolve, reject);
} catch (e) {
reject(e);
}
});
this.onRejectedCallbacks.push(reason => {
try {
let x = onRejected(reason);
resolvePromise(newPromise, x, resolve, reject);
} catch (e) {
reject(e);
}
});
}));
}
}
}
function resolvePromise(promise2, x, resolve, reject) {
if (x === promise2) {
reject(new TypeError('循環(huán)引用'));
}
if (x instanceof AjPromise) {
if (x.state === PENDING) {
x.then(
y => {
resolvePromise(promise2, y, resolve, reject);
},
reason => {
reject(reason);
}
);
} else {
x.then(resolve, reject);
}
} else if (x && (typeof x === 'function' || typeof x === 'object')) {
let called = false;
try {
let then = x.then;
if (typeof then === 'function') {
then.call(
x,
y => {
if (called) return;
called = true;
resolvePromise(promise2, y, resolve, reject);
},
r => {
if (called) return;
called = true;
reject(r);
}
);
} else {
resolve(x);
}
} catch (e) {
if (called) return;
called = true;
reject(e);
}
} else {
resolve(x);
}
}
AjPromise.deferred = function() {
let defer = {};
defer.promise = new AjPromise((resolve, reject) => {
defer.resolve = resolve;
defer.reject = reject;
});
return defer;
};
module.exports = AjPromise;
實現(xiàn)一個promise~(Promises/A+ 規(guī)范
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門持舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伪窖,“玉大人覆山,你說我怎么就攤上這事汹买×木螅” “怎么了耙蔑?”我有些...
- 文/不壞的土叔 我叫張陵须揣,是天一觀的道長。 經常有香客問我疯汁,道長幌蚊,這世上最難降的妖魔是什么溢豆? 我笑而不...
- 正文 為了忘掉前任漩仙,我火速辦了婚禮队他,結果婚禮上漱挎,老公的妹妹穿的比我還像新娘雀哨。我一直安慰自己雾棺,他們只是感情好捌浩,可當我...
- 文/花漫 我一把揭開白布尸饺。 她就那樣靜靜地躺著浪听,像睡著了一般迹栓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酥郭,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婉刀!你這毒婦竟也來了序仙?” 一聲冷哼從身側響起潘悼,我...
- 正文 年R本政府宣布市咽,位于F島的核電站施绎,受9級特大地震影響,放射性物質發(fā)生泄漏致稀。R本人自食惡果不足惜抖单,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望货矮。 院中可真熱鬧斯够,春花似錦雳刺、人聲如沸掖桦。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽宿稀。三九已至,卻和暖如春赖捌,著一層夾襖步出監(jiān)牢的瞬間祝沸,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 1.什么是Promise? Promise是JS異步編程中的重要概念跛蛋,異步抽象處理對象,是目前比較流行Javasc...
- Promise表示一個異步操作的最終結果痊硕。與Promise最主要的交互方法是通過將函數(shù)傳入它的then方法從而獲取...
- Promise 實現(xiàn)一個符合 Promise/A+ 規(guī)范的 MyPromise问芬,并實現(xiàn) resolve、rejec...
- 在需要多個操作的時候寿桨,會導致多個回調函數(shù)嵌套,導致代碼不夠直觀强戴,就是常說的回調地獄亭螟,通常通過promise來解決P...
- 實現(xiàn) Promise/A+ 規(guī)范 檢測通過 實現(xiàn) ES6 Promise 方法