题目

  1. LazyMan('Tony');
  2. // Hi I am Tony
  3. LazyMan('Tony').sleep(10).eat('lunch');
  4. // Hi I am Tony
  5. // 等待了10秒...
  6. // I am eating lunch
  7. LazyMan('Tony').eat('lunch').sleep(10).eat('dinner');
  8. // Hi I am Tony
  9. // I am eating lunch
  10. // 等待了10秒...
  11. // I am eating diner
  12. LazyMan('Tony').eat('lunch').eat('dinner').sleepFirst(5).sleep(10).eat('junk food');
  13. // Hi I am Tony
  14. // 等待了5秒...
  15. // I am eating lunch
  16. // I am eating dinner
  17. // 等待了10秒...
  18. // I am eating junk food

思路

  • 一个class
  • 一个taskList
  • push任务
  • 执行放在marcoTask/miscoTask中

    结果

    ```javascript class Lazy { name; isExec = false; taskList = [];

    constructor(name) { this.name = name; console.log(Hi I am ${name})

}

async exec() { if (this.taskList.length > 0) { console.log(“exec”); await this.taskList.shift()(); setTimeout(() => { this.exec(); }, 0); } else { this.isExec = false; } }

sleepFirst(time) { const fn = function () { return new Promise((res) => { setTimeout(() => { res(); console.log(${time}s gone); }, time * 1000); }); };

  1. console.log("push sleep");
  2. this.taskList.unshift(fn);
  3. return this;

}

sleep(time) { const fn = function () { return new Promise((res) => { setTimeout(() => { res(); console.log(${time}s gone); }, time * 1000); }); };

  1. console.log("push sleep");
  2. this.taskList.push(fn);
  3. return this;

}

eat(name) { const fn = function () { return new Promise((res) => { setTimeout(() => { res(); console.log(I am eating ${name}); }, 1); }); };

  1. console.log("push eat");
  2. this.taskList.push(fn);
  3. if (!this.isExec) {
  4. this.isExec = true;
  5. setTimeout(() => {
  6. console.log("exec --");
  7. this.exec();
  8. }, 0);
  9. }
  10. return this;

} }

function LazyMan(name) { return new Lazy(name); }

// LazyMan(“Tony”); // LazyMan(“Tony”).sleep(1).eat(“lunch”); // LazyMan(“Tony”).eat(“lunch”).sleep(3).eat(“dinner”); LazyMan(“Tony”) .eat(“lunch”) .eat(“dinner”) .sleepFirst(5) .sleep(10) .eat(“junk food”);

  1. <a name="FOEDj"></a>
  2. ## 优化
  3. ```javascript
  4. class Lazy {
  5. name;
  6. taskList = [];
  7. constructor(name) {
  8. this.name = name;
  9. console.log(`Hi I am ${name}`);
  10. setTimeout(() => {
  11. this.next();
  12. }, 0);
  13. }
  14. next() {
  15. const fn = this.taskList.shift();
  16. fn && fn();
  17. }
  18. sleepFirst(time) {
  19. const fn = () => {
  20. setTimeout(() => {
  21. console.log(`${time}s gone`);
  22. this.next();
  23. }, time * 1000);
  24. };
  25. this.taskList.unshift(fn);
  26. return this;
  27. }
  28. sleep(time) {
  29. const fn = () => {
  30. setTimeout(() => {
  31. console.log(`${time}s gone`);
  32. this.next();
  33. }, time * 1000);
  34. };
  35. this.taskList.push(fn);
  36. return this;
  37. }
  38. eat(name) {
  39. const fn = () => {
  40. console.log(`I am eating ${name}`);
  41. this.next();
  42. };
  43. this.taskList.push(fn);
  44. return this;
  45. }
  46. }
  47. function LazyMan(name) {
  48. return new Lazy(name);
  49. }
  50. // LazyMan("Tony");
  51. // LazyMan("Tony").sleep(1).eat("lunch");
  52. // LazyMan("Tony").eat("lunch").sleep(3).eat("dinner");
  53. LazyMan("Tony")
  54. .eat("lunch")
  55. .eat("dinner")
  56. .sleepFirst(5)
  57. .sleep(10)
  58. .eat("junk food");