模仿交通信号灯,最简单的处理方式不过是一个简单的递归
function traffic(num) { var signal = ['红', '黄', '蓝']; num = num < (signal.length - 1) ? (num + 1) : 0; setTimeout(() => { console.log(signal[num]); deng(num); }, 1000); }
非常简单的一个功能,突然想到了队列的先进后出,蛮可以用队列的方式再升级一下,顺便巩固下队列的知识
创建队列
let Queue = (function () { const items = new WeakMap();//WeakMap对象是密钥/值对的集合,其中密钥被弱引用。键必须是对象,值可以是任意值。 class Queue { constructor() { items.set(this, []); } enqueue(...element) {//向队列尾部添加一个(或多个)新的项 let q = items.get(this); q.push(...element); } dequeue() {//移除队列的第一个(排在队列最前面的)项,并返回被移除的元素。 let q = items.get(this); let r = q.shift(); return r; } front() {//返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息) let q = items.get(this); return q[0]; } isEmpty() {//如果队列中不包含任何元素,返回true,否则返回false。 return items.get(this).length == 0; } size() {//返回队列包含的元素个数,与数组的length属性类似。 let q = items.get(this); return q.length; } clear() {//清空队列里面的元素。 items.set(this, []); } print() {//打印队列为String到控制台 console.log(this.toString()); } toString() {//输出队列以String模式。 return items.get(this).toString(); } } return Queue; })();
npm上其实是有现成的代码的,可以直接 npm install queue
定义好了队列,调用的时候有一个小技术点,就是当for遇到了setTimeout
let sleep = ()=>{ return new Promise((resolve,reject)=>{ setTimeout(() => { resolve(); }, 1000); }); }
多年烂大街的面试题,其实就这么一个就解决了。。。
最终的调用
async function traffic(nameList, num) { let queue = new Queue(); for (let i = 0; i < nameList.length; i++) { queue.enqueue(nameList[i]); } while (queue.size() > 1) { for (let i = 0; i < num; i++) { let key = queue.dequeue(); console.log(key); queue.enqueue(key); await sleep(); } } }
欢迎各大佬指正。。