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中有一个实例的状态发生改变(变为fulfilled
或rejected
),p的状态就跟着改变。并把第一个改变状态的promise的返回值,传给p的回调函数
三个异步操作同时开始进行,最快执行完的就是f2(),把第一个返回结果的值传入.then()返回,其余的继续执行,但是不返回丢弃掉了。
Promise.race([f1(),f2(),f3()]).then((result)=>{ console.log(result) }) // 1s之后控制台输出了一个1,没有其余输出