1. class Floor {
    2. constructor() {
    3. this.queue = [];
    4. this.goingup = true;
    5. this.running = false;
    6. this.timer = null;
    7. // 每秒钟执行一次
    8. timer = setInterval(run, 1000);
    9. }
    10. // 按下按钮,添加任务
    11. dial(floor) {
    12. // 避免重复添加
    13. if (queue.indexOf(floor) < 0) {
    14. queue.push(floor);
    15. // 确保前进方向上楼层都是以楼层数为序的
    16. queue.sort();
    17. if (!running) {
    18. checkStatus();
    19. }
    20. }
    21. }
    22. // 更新电梯状态,向上和向下
    23. checkStatus() {
    24. // 记录当前电梯的运行状态,queue非空,电梯就要动起来
    25. running = queue.length > 0 ? true : false;
    26. if (currentFloor == MIN_FLOOR) {
    27. // 上行
    28. goingup = true;
    29. } else if (currentFloor == MAX_FLOOR) {
    30. // 下行
    31. goingup = false;
    32. } else {
    33. // 在中间,计算是否还有要走的
    34. goingup && (!running || currentFloor < getMaxInQueue(queue))
    35. ? (goingup = true)
    36. : (goingup = false);
    37. !goingup && (!running || currentFloor > getMinInQueue(queue))
    38. ? (goingup = false)
    39. : (goingup = true);
    40. }
    41. }
    42. // 主函数
    43. run() {
    44. if (running) {
    45. // 检查当前楼层是否被按,按了就ding
    46. if (queue.indexOf(currentFloor) > -1) {
    47. ding(currentFloor);
    48. } else {
    49. goingup ? moveUp() : moveDown();
    50. updateFloorInfo();
    51. }
    52. checkStatus();
    53. }
    54. }
    55. ding(floor) {
    56. if (timer) {
    57. // 暂停计时器
    58. clearInterval(timer);
    59. // 灭灯
    60. lightsOut(floor);
    61. // 将该楼层从数组中移除
    62. removeFromQueue(queue, floor);
    63. // 开门
    64. openDoor();
    65. setTimeout(function () {
    66. // 过一会关门
    67. closeDoor();
    68. setTimeout(function () {
    69. // 重新开启计时器
    70. timer = setInterval(run, 1000);
    71. }, 3000);
    72. }, 4000);
    73. }
    74. }
    75. moveUp() {
    76. if (currentFloor < MAX_FLOOR) {
    77. currentFloor++;
    78. }
    79. }
    80. moveDown() {
    81. if (currentFloor > MIN_FLOOR) {
    82. currentFloor--;
    83. }
    84. }
    85. }