Promise 类
class Pro {
callbacks = [];
state = "pending";
value = null;
constructor(fn) {
// 初始化,把resolve作为参数传入,等待调用
fn(this.resolve.bind(this));
}
// callback为回调,先注册,也就是放入callbacks数组中
then(callback) {
if (this.state === "pending") {
this.callbacks.push(callback);
} else {
// 由于state不是pending, 遵循promise状态只能改一次的要求,我们直接操作回调传入参数执行
callback(this.value);
}
return this;
}
// resolve也就是fn的第一次参数,循环执行所有callback
resolve(value) {
this.state = "fulfilled";
// setTimeout使内部变成异步,在同步执行完最后执行这里,处理fn是同步的情况下then中的回调函数已经注册,然后在这里去执行,不会出现callbacks是空数组的情况
setTimeout(() => {
this.value = value;
this.callbacks.forEach((callback) => callback(value));
});
}
}
调用
new Pro((resolve) => {
setTimeout(() => {
console.log(0);
resolve("resolve");
}, 2000);
})
.then((tip) => {
console.log(1);
console.log(tip);
})
.then((tip) => {
console.log(2);
console.log(tip);
});
Promise.all 实现
Promise.prototype.all = function (promises) {
let results = [];
let promiseCount = 0;
let promisesLength = promises.length;
return new Promise(function (resolve, reject) {
for (let item of promises) {
// 执行每个item
Promise.resolve(item).then(
function (res) {
promiseCount++;
// 按照顺序插入结果
results[i] = res;
// 如果全部执行成功,返回成功
if (promiseCount === promisesLength) {
return resolve(results);
}
},
function (err) {
return reject(err);
}
);
}
});
};
Promise.race 实现
Promise.prototype.race = function (promises) {
return new Promise((resolve, reject) => {
for (let item of promises) {
Promise.resolve(item)
.then((res) => {
return resolve(res);
})
.catch((err) => {
return reject(err);
});
}
});
};
简单来说就是声明 Promise 时,会执行 Promise 第一个函数参数和 then 的参数函数。
then
用来把回调传入 callback 数组中,相当于注册,规定好了 reslove 时,回调的执行,然后等待 resolve 调用,resolve 就会把 callback 数组中的函数全部执行
- then 中
return this
,用于实现 then 的链式调用 - 如果 Promise 是同步的,则执行 resolve 的时候 callback 还没注册