// https://juejin.cn/post/7085298532365631501
function Promise1(performer) {
this.pending = [];
this.value = undefined;
const resolve = (value) => {
this.value = value;
if (this.pending) {
for (let onFulfilled of this.pending) {
onFulfilled(this.value);
}
this.pending = undefined;
}
};
performer(resolve)
}
Promise1.prototype.then = function (onFulfilled) {
const prev = this
const promise = new Promise1(resolve => {
const onSpreadFulfilled = function (value) {
resolve(onFulfilled(value))
}
if (prev.pending) {
prev.pending.push(onSpreadFulfilled)
} else {
onSpreadFulfilled(prev.value)
}
})
return promise
}
const p = new Promise1((resolve) => {
setTimeout(() => resolve(666), 100);
});
// p.then((res) => {
// console.log(res);
// });
p.then(res => {
console.log('res1: %s', res);
return res + 1;
}).then(res => {
console.log('res2: %s', res);
})
console