再谈Promise

之前我写了一篇介绍Promise的文章:面试题常客之-Promise,但是没有实际的例子。

因为平时我做的项目都比较小,所以处理异步函数一般都使用async await,很少用到Promise.then,但是这一天就碰到了这么一个问题。

1. 问题

有6个异步请求,分别是A1A2A3B1B2B3。而A1A2A3的执行顺序是A1→A2→A3,并且A2要获得A1取得的数据,而B1B2B3A1A2A3按照顺序执行完成后同时执行,并且只能通过Promise实现。

A1A2A3

当时听题的时候被问的一愣一愣的,但是现在回想起来,使用async await可能是最简单的方法,但是题目中明确的说明了只能使用Promise进行实现,那么这道题目应该怎么解呢。

首先我们用setTimeout来模拟出上面的这些数据:

let a1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let time = 1;
      console.log("a1经过1s获得了数据");
      resolve(time);
    }, 1000);
  });
};

let a2 = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let newTime = time + 1;
      console.log("a2经过" + newTime + "s获得了数据");
      resolve(newTime);
    }, 3000);
  });
};

let a3 = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let newTime = time + 1;
      console.log("a3经过" + newTime + "s获得了数据");
      resolve(newTime);
    }, 4000);
  });
};

let b1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("b1经过1s获得了数据");
    }, 1000);
  });
};

let b2 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("b2经过1s获得了数据");
    }, 1000);
  });
};

let b3 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("b3经过1s获得了数据");
    }, 1000);
  });
};

2. Promise实现

嵌套实现:

a1().then(res => {
  a2(res).then(res => {
    a3(res).then(res=>{
      b1();
      b2();
      b3();
    });
  });
});

.then链式调用实现:

a1().then(res => {
  return res;
}).then(res => {
  return a2(res);
}).then(res => {
  return a3(res);
}).then(res => {
  b1();
  b2();
  b3();
});

3. async await实现

没有对比就没有伤害,async await做为ES7的终极大招,来实现这个问题。

看看和Promise的区别。

(async () => {
  let time = await a1();
  time = await a2(time);
  await a3(time);
  b1();
  b2();
  b3();
})();

这…只能说async await牛逼。