实现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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。