1、顺序执行带来的问题

下面代码模拟了三个请求接口,也就是三个请求没有任何依赖关系,却要等到上一个执行完才执行下一个,带来时间上的浪费。

  1. (async () => {
  2. const getList1 = await getList1();
  3. const getList2 = await getList1();
  4. const getList3 = await getList2();
  5. })();

解决方案:

  1. (async () => {
  2. const listPromise = getList();
  3. const anotherListPromise = getAnotherList();
  4. await listPromise;
  5. await anotherListPromise;
  6. })();
  7. // 也可以使用
  8. (async () => {
  9. Promise.all([getList(), getAnotherList()]).then(...);
  10. })();

2、try catch 捕获错误

使用 try catch 捕获错误,当我们需要捕获多个错误并做不同的处理时,try catch 会导致代码杂乱:

  1. async function asyncTask(cb) {
  2. try {
  3. const res1 = await request1(resByRequest1); //resByRequest1返回值为promise
  4. if(!res1) return cb('error1');
  5. } catch(e) {
  6. return cb('error2');
  7. }
  8. try {
  9. const res2 = await request2(resByRequest2); //resByRequest2返回值为promise
  10. } catch(e) {
  11. return cb('error3');
  12. }
  13. }

简化错误捕获:添加一个中间函数:

  1. export default function to(promise) {
  2. return promise.then(data => {
  3. return [null, data];
  4. })
  5. .catch(err => [err]);
  6. }

错误捕获的代码:

  1. async function asyncTask() {
  2. let err, data
  3. [err, data1] = await to(resByRequest1);
  4. if(!data1) throw new Error('xxxx');
  5. [err, data2] = await to(resByRequest2);
  6. if(!data2) throw new Error('xxxx');
  7. }

3、练习题目

红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用 Promse 实现)

  1. function red(){
  2. console.log('red');
  3. }
  4. function green(){
  5. console.log('green');
  6. }
  7. function yellow(){
  8. console.log('yellow');
  9. }
  10. var light = function(timmer, cb){
  11. return new Promise(function(resolve, reject) {
  12. setTimeout(function() {
  13. cb();
  14. resolve();
  15. }, timmer);
  16. });
  17. };
  18. var step = function() {
  19. Promise.resolve().then(function(){
  20. return light(3000, red);
  21. }).then(function(){
  22. return light(2000, green);
  23. }).then(function(){
  24. return light(1000, yellow);
  25. }).then(function(){
  26. step();
  27. });
  28. }
  29. step();