1. Promise.all接收一个数组,数组里面可以是promise也可以是常量
  2. 等到里面的promise全部执行完成后,才会返回结果。
  3. 如果里面有一个执行失败了,它会在catch里面捕获,其它的还会继续执行,因为promise在实例化时,就执行了;.then()只是用来看它的结果。

题目:补充代码(实现Promise.all())

  1. function PromiseAll(promiseArray) {
  2. //请在此处补全代码
  3. }
  4. const p1 = new Promise((res, rej) => {
  5. setTimeout(() => {
  6. res('p1')
  7. }, 1000)
  8. })
  9. const p2 = new Promise((res, rej) => {
  10. setTimeout(() => {
  11. res('p2')
  12. }, 2000)
  13. })
  14. const p3 = new Promise((res, rej) => {
  15. setTimeout(() => {
  16. res('p3')
  17. }, 3000)
  18. })
  19. const test = PromiseAll([p1, p2, p3])
  20. .then(res => console.log(res))
  21. .catch(e => console.log(e))
  22. console.log(test);

答案

  1. function PromiseAll(promiseArray) { //返回一个Promise对象
  2. return new Promise((resolve, reject) => {
  3. if (!Array.isArray(promiseArray)) { //传入的参数是否为数组
  4. return reject(new Error('传入的参数不是数组!'))
  5. }
  6. const res = []
  7. let counter = 0 //设置一个计数器
  8. for (let i = 0; i < promiseArray.length; i++) {
  9. Promise.resolve(promiseArray[i]).then(value => {
  10. counter++ //使用计数器返回 必须使用counter
  11. res[i] = value
  12. if (counter === promiseArray.length) {
  13. resolve(res)
  14. }
  15. }).catch(e => reject(e))
  16. }
  17. })
  18. }