CVTE3.24前端二面
直入主题,问我项目做了啥
目前做的毕业设计有啥难点,扯了小程序相关的
然后就开始手撕了,这个手撕搞了几十分钟,写对了,但是因为实例代码有点问题,结果总是不对,并且因为我写的答案面试官说没见过有人这么写,然后他在那看我这个到底为什么总能运行对:
/** * 请实现一个队列处理程序,当传入任务队列时,能够串行地处理完任务, * 如果传入的任务包含异步执行,那么必须确保异步执行完毕之后才会执行后面的任务。 **/ function queue(list){ } function task1(next){ setTimeout(function(){ console.log(1); next(); }, 1000) } function task2(next){ console.log(2) next(); } function task3(next){ setTimeout(function(){ console.log(3); next(); }, 200) } queue([task1, task2, task3]) // queue([task1, task2, task3]); // 下面多了一行这个,导致打印结果一直不对 // 按顺序输出 1, 2, 3
标准答案应该是用递归的:
function queue(list){ let i = 0; function next() { if(i < list.length) { list[i](next); i ++; } } next(); }
但因为我最近看了promise的串行执行,我就用起了promise:
function queue(list){ list.reduce((p, f) => { return p.then(() => { return new Promise(next => { f(next); }) }) }, Promise.resolve()); }
然后因为实例代码多了一行queue([task1, task2, task3]);
,搞得打印结果总是会奇奇怪怪,后来面试官让我用递归,然后我写出了参考答案的那种,打印结果还是奇奇怪怪,后来两个人就在那看为什么,结果发现最底下居然多了点东西,删掉之后两个都对了
面试官觉得我写的那个可能会有漏洞,就让我调调每个任务的延迟时间,但是每次都没有问题,然后就出这道题的变体给我,让我接着用我的写法完成:
// 加多一个参数 count ,表示任务最大并行数 function queue(list, count){ } queue([task1, task2, task3], count);
然后参考的答案是这种的:
function queue(list){ let i = 0; function next() { if(i < list.length) { list[i](next); i ++; } } for(let j = 0; j < count; j ++) { next(); } }
我的是这种的:
function queue(list, count){ let i = 0; // 相当于开启 count 个执行线路,那么就可以用 reduce 创建 count 条 promise 执行链 const path = []; for(let j = 0; j < count; j ++) { path[j] = list.reduce((p, f) => { return p.then(() => { if(i >= list.length) return; return new Promise(next => { list[i ++](next); }) }) }, Promise.resolve()); } Promise.all(path); }
结果也是执行对的,然后由于时间关系,面试官就没有给我看第三种变体了,就下一题了
如果班上50个人,至少两个人同一天生日的可能性是多少(刚开始想着用全排列算概率,然后其实想考察的是大数定律)
然后面试官说要问的问题就这么多了,我没有什么问题想反问,就结束了
#cvte##广州视源电子科技股份有限公司##面经#