function f1(){
            return new Promise((res,rej)=>{
                setTimeout(() => {
                    res(2)
                }, 2000);
            })
        }
        function f2(){
            return new Promise((res,rej)=>{
                setTimeout(() => {
                    res(1)
                }, 1000);
            })
        }
        function f3(){
            return new Promise((res,rej)=>{
                setTimeout(() => {
                    res(3)
                }, 3000);
            })
        }

Promise.all(iterable)方法返回一个Promise实例。这个实例在iterable参数内的所有Promise对象都resolved或者参数不包含Promise时回调完成。如果参数中有一个rejected,则此实例回调失败,失败原因时第一个rejected的promise结果。
Promise.all方法接受一个数组作参数,数组中的对象(p1、p2、p3)均为promise实例(如果不是一个promise,该项会被用Promise.resolve转换为一个promise)。它的状态由这三个promise实例决定
三个异步操作同时开始进行,等待所有都返回结果的时候,将结果保存在一个数组中返回

        Promise.all([f1(),f2(),f3()]).then((result)=>{
            console.log(result)
        })
// 3s之后控制台输出了一个[2,1,3]的数组

Promise.race(iterable) 。这个实例在iterable参数内的只要有一个Promise对象状态变为解决或拒绝,返回的 promise就会解决或拒绝。
Promise.race方法同样接受一个数组作参数。当p1, p2, p3中有一个实例的状态发生改变(变为fulfilledrejected),p的状态就跟着改变。并把第一个改变状态的promise的返回值,传给p的回调函数
三个异步操作同时开始进行,最快执行完的就是f2(),把第一个返回结果的值传入.then()返回,其余的继续执行,但是不返回丢弃掉了。

        Promise.race([f1(),f2(),f3()]).then((result)=>{
            console.log(result)
        })
// 1s之后控制台输出了一个1,没有其余输出