实现promise的all与race
Promise.all(iterable)
总结:
Promise承受一个iterable类型的输出(如Array、Set、Map)等,
当iterable参数所有的Promise对象都resolve时,该办法会返回一个蕴含所有resolve传递的值的Promise实例。
办法实例
const promise1 = Promise.resolve(3);const promise2 = 42;const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo');});Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values);});// expected output: Array [3, 42, "foo"]
手写实现
function promiseAll(arrays){ if(!Array.isArray(arrays)) return 'not Array' var promiseValues = [] var promiseCount = 0 return new Promise((resolve,reject)=>{ for(var i = 0; i < arrays.length; i++){ Promise.resolve(arrays[i]).then((value)=>{ promiseValues.push(value) promiseCount++ if(promiseCount == arrays.length) resolve(promiseValues) }, (err)=>{reject(err)}) } })}
测试用例
promiseAll([promise1,promise2,promise3]).then((values)=>{console.log(values)})//[3, 42, "foo"]
Promise.race(iterable)
总结:当iterable参数中任意一个promise胜利或失败,则返回蕴含该值的promise实例。
办法实例
const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'one');});const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'two');});Promise.race([promise1, promise2]).then((value) => { console.log(value); // Both resolve, but promise2 is faster});// expected output: "two"
手写实现
function promiseRace(arrays){ if(!Array.isArray(arrays)) return 'not Array' return new Promise((resolve,reject)=>{ for(var i = 0; i < arrays.length; i++){ Promise.resolve(arrays[i]).then((value)=>{ resolve(value) }, (err)=>{reject(err)}) } })}
测试用例
promiseRace([promise1,promise2]).then(function(value){console.log(value)}) // one