- Promise.all接收一个数组,数组里面可以是promise也可以是常量
- 等到里面的promise全部执行完成后,才会返回结果。
- 如果里面有一个执行失败了,它会在catch里面捕获,其它的还会继续执行,因为promise在实例化时,就执行了;.then()只是用来看它的结果。
题目:补充代码(实现Promise.all())
function PromiseAll(promiseArray) { //请在此处补全代码}const p1 = new Promise((res, rej) => { setTimeout(() => { res('p1') }, 1000)})const p2 = new Promise((res, rej) => { setTimeout(() => { res('p2') }, 2000)})const p3 = new Promise((res, rej) => { setTimeout(() => { res('p3') }, 3000)})const test = PromiseAll([p1, p2, p3]) .then(res => console.log(res)) .catch(e => console.log(e))console.log(test);
答案
function PromiseAll(promiseArray) { //返回一个Promise对象 return new Promise((resolve, reject) => { if (!Array.isArray(promiseArray)) { //传入的参数是否为数组 return reject(new Error('传入的参数不是数组!')) } const res = [] let counter = 0 //设置一个计数器 for (let i = 0; i < promiseArray.length; i++) { Promise.resolve(promiseArray[i]).then(value => { counter++ //使用计数器返回 必须使用counter res[i] = value if (counter === promiseArray.length) { resolve(res) } }).catch(e => reject(e)) } })}