不管是寒冬仍是暖冬,找工做以前都须要作好充足的准备,面试的时候才能作到游刃有余。此文是把我最近找工做准备的以及笔试面试中涉及到的手写题作一个总结。给本身,也给须要的同窗。 手写题是比较好准备的一个环节,大部分公司考察的题也就那么多,大都不会超出范围。前端
sleep
函数的做用就是延迟指定时间后再执行接下来的函数。用 promise
很好实现。node
function sleep(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(true); }, time*1000); }); } 复制代码
Promise.all
须要等到全部的 promise
的状态都变成 fulfilled
以后才 resolve
, 但只要有一个 promise
失败即返回失败的结果。面试
Promise.all = function(arr){ return new Promise((resolve,reject) => { if(!Array.isArray(arr)){ throw new TypeError(`argument must be a array`) } var length = arr.length; var resolveNum = 0; var resolveResult = []; for(let i = 0; i < length; i++){ arr[i].then(data => { resolveNum++; resolveResult.push(data) if(resolveNum == length){ return resolve(resolveResult) } }).catch(data => { return reject(data) }) } }) } 复制代码
promise.retry
的做用是执行一个函数,若是不成功最多能够尝试 times 次。传参须要三个变量,所要执行的函数,尝试的次数以及延迟的时间。小程序
Promise.retry = function(fn, times, delay) { return new Promise(function(resolve, reject){ var error; var attempt = function() { if (times == 0) { reject(error); } else { fn().then(resolve) .catch(function(e){ times--; error = e; setTimeout(function(){attempt()}, delay); }); } }; attempt(); }); }; 复制代码
同步的 callback 用的最多的是在 node 的回调中,例以下面这种,包装完以后就能够愉快的使用 .then
了。微信小程序
nodeGet(param, function (err, data) { }) // 转化成promise形式 function nodeGetAysnc(param) { return new Promise((resolve, reject) => { nodeGet(param, function (err, data) { if (err !== null) return reject(err) resolve(data) }) })} 复制代码
按照上面的思路,便可写出通用版的形式。promise
function promisify(fn,context){ return (...args) => { return new Promise((resolve,reject) => { fn.apply(context,[...args,(err,res) => { return err ? reject(err) : resolve(res) }]) }) } } 复制代码
微信小程序最一开始对并发数限制为5个,后来升级到10个,若是超过10个会被舍弃。后来微信小程序升级为不限制并发请求,但超过10个会排队机制。也就是当同时调用的请求超过 10 个时,小程序会先发起 10 个并发请求,超过 10 个的部分按调用顺序进行排队,当前一个请求完成时,再发送队列中的下一个请求。bash
function concurrentPoll(){ this.tasks = []; this.max = 10; setTimeout(() => { this.run() },0) } concurrentPoll.prototype.addTask = function(task){ this.tasks.push(task) } concurrentPoll.prototype.run = function(){ if(this.tasks.length == 0){ return } var min = Math.min(this.tasks.length, max); for(var i = 0; i < min; i++){ this.max--; var task = this.tasks.shift(); task().then((res) => { console.log(res) }).catch((err) => { console.log(err) }).finally(() => { this.max++; this.run(); }) } } 复制代码
有错误之处还请小伙伴们及时指出,以避免误人子弟。想看往期内容,翻到页面最上面有连接~微信