Promise

58 阅读1分钟
// 1、基本框架:status, val, reason, resolve, reject, then
// 2、resolve, reject 触发状态改变
// 3、构造函数立即执行
// 4、订阅发布模式,存状态回调的函数
// 5、resolve、reject 函数依次取出执行
// 6、链式调用-- resolve
function MyPromise(excutor) {
	const self = this;
	this.status = "pending";
	self.val = null;
	self.reason = null;
	self.fulfilledQueue = [];
	self.rejectedQueue = [];
	function _resolve(val) {
		if (self.status === "pending") {
			self.status = "fulfilled";
			self.val = val;
			if (val instanceof MyPromise) {
				val.then((_val) => {
					self.val = _val;
					self.status = "fulfilled";
					let cb;
					while ((cb = self.fulfilledQueue.shift())) {
						cb(_val);
					}
				});
			} else {
				console.log(self.fulfilledQueue.length);
				let cb;
				while ((cb = self.fulfilledQueue.shift())) {
					console.log("ssssss");
					cb(val);
				}
			}
		}
	}
	function _reject(reason) {
		if (self.status === "pending") {
			self.status = "rejected";
			self.reason = reason;
			while ((cb = self.rejectedQueue.shift())) {
				console.log("ssssss");
				cb(reason);
			}
		}
	}
	excutor(_resolve, _reject);
}

MyPromise.prototype.then = function (onFulfilled, onRejected) {
	const _this = this;
	const promise2 = new MyPromise((resolve, reject) => {
		onFulfilled =
			typeof onFulfilled == "function"
				? onFulfilled
				: function (data) {
						return resolve(data);
				  };
		onRejected =
			typeof onRejected == "function"
				? onRejected
				: function (err) {
						throw err;
				  };
		if (_this.status === "pending") {
			_this.fulfilledQueue.push((value) => {
				resolve(onFulfilled(value));
			});
			_this.rejectedQueue.push(onRejected);
		}

		if (_this.status === "fulfilled") {
			console.log("11111");
			const res = onFulfilled(this.value);
			if (res instanceof MyPromise) {
				res.then(resolve, reject);
			} else {
				resolve(res);
			}
		}
	});
	return promise2;
};

const demo = new MyPromise((resolve, reject) => {
	setTimeout(() => {
		resolve("myPromise");
	}, 2000);
});
demo.then((res) => {
	console.log(res);
})
	.then(() => {
		console.log("wlejlejl");
	})
	.then(() => {
		console.log("pppppppppppppp");
	});