手写 promise

121 阅读1分钟

`class MyPromise { constructor(fn) { this.state = 'pending'; this.successFun = []; this.failFun = [];

	let resolve = (val) => {
		if (this.state !== 'pending') return;

		this.state = 'success';
		setTimeout(() => {
			this.successFun.forEach((fun) => fun.call(this, val));
		});
	};

	let reject = (err) => {
		if (this.state !== 'pending') return;

		this.state = 'fail';
		setTimeout(() => {
			this.failFun.forEach((fun) => fun.call(this, err));
		});
	};
	try {
		fn(resolve, reject);
	} catch (error) {
		reject(error);
	}
}

then(resolveCb, rejectCb) {
	resolveCb = typeof resolveCb !== 'function' ? (v) => v : resolveCb;
	rejectCb =
		typeof rejectCb !== 'function'
			? (err) => {
					throw err;
			  }
			: rejectCb;
	return new MyPromise((resolve, reject) => {
		this.successFun.push((val) => {
			let x = resolveCb(val);
			x instanceof MyPromise ? x.then(resolve, reject) : resolve(x);
		});

		this.failFun.push((val) => {
			let x = rejectCb(val);
			x instanceof MyPromise ? x.then(resolve, reject) : reject(x);
		});
	});
}

static all(promiseArr) {
	let result = [];
	return new MyPromise((resolve, reject) => {
		for (let i = 0; i < promiseArr.length; i++) {
			promiseArr[i].then(
				(res) => {
					result.push(res);
					if (i === promiseArr.length - 1) {
						resolve(result);
					}
				},
				(err) => {
					result(err);
				}
			);
		}
	});
}

static race(promiseArr) {
	return new MyPromise((resolve, reject) => {
		for (let i = 0; i < promiseArr.length; i++) {
			promiseArr[i].then(
				(res) => {
					resolve(res);
				},
				(err) => {
					reject(err);
				}
			);
		}
	});
}

}

module.exports = MyPromise; `