手写Promise.all和Promise.race

2,414 阅读1分钟

手写Promise.all和Promise.race

Promise.all

function promiseAll (promises) {
	if (!Array.isArray(promises)) {
		throw new Error ("promises must to be an array!!!");
	}
	return new Promise (function (resolve, reject) {
		let promiseNum = promises.length;
		let resolvedCount = 0;
		let resolveValues = new Array(promiseNum);
		try {
			for (let i = 0; i < promiseNum; i++) {
                promises[i].then(function (value) {
                    resolveValues[i] = value;
                    if (++resolvedCount === promiseNum) {
                        resolve(resolveValues);
                    }
                })
		} catch (error) {
			reject(error);
		}
	})
}

Promise.race

function promiseRace(promise) {
	if (!Array.isArray (promises)) {
		throw new Error ("promises must be an array!!!");
	
	}
	let resolved = false;
	return new Promise(function (resolve, reject) {
		try{
			promises.forEach(p =>
                p.then(data => {
                	if (!resolved) {
                		resolved = true;
                		resolve (data);
                	}
                })
            )
		} catch (error) {
			reject(error);
		}
	})
}