当前位置: 首页 > news >正文

自驾游自由行网站建设最新消息

自驾游自由行网站建设,最新消息,东莞便宜做网站,域名命名网站目录 异步调度问题 题目一 答案 题目二 答案 递归输出 题目一 答案 Promise相关 题目一 答案 占用空间大小 题目一 答案 渲染虚拟节点 题目一 答案 实现for of 题目一 答案 异步调度问题 题目一 1.实现一个带并发限制的异步调度Scheduler,保证同…

目录

异步调度问题

题目一

答案

题目二

 答案

递归输出

题目一

 答案

Promise相关

题目一

答案

占用空间大小

题目一

答案

渲染虚拟节点

题目一

答案

实现for of

题目一

答案

 


异步调度问题

题目一

1.实现一个带并发限制的异步调度Scheduler,保证同时运行的任务最多有N个。完善下面代码中的Scheduler类,使以下程序能正确输出

class Scheduler {add(promiseCreator) {}
}
const timeout = (time) => new Promise(resolve => {setTimeout(resolve, time)
})
const scheduler = new Scheduler(3)
const addTask = (time, order) => {scheduler.add(() => timeout(time)).then(() => console.log(order))
}
addTask(1000, 'a')
addTask(500, 'b')
addTask(100, 'c')
addTask(2000, 'd')
addTask(10, 'f')

答案

方法一

class Schdule {constructor(n) {this.max = maxthis.count = 0this.queue = []}async add(promiseCreator) {if (this.count >= this.max) {await new Promise((resolve, reject) => this.queue.push(resolve))}this.count++;let res = await promiseCreator()this.count--;if (this.queue.length) {this.queue.shift()()}return res}
}

方法二 

class Schdule {constructor(n) {this.max = maxthis.count = 0this.queue = []}add(promiseCreator) {return new Promise(resolve => {promiseCreator.resolve = resolve; // 保存当前promise的状态if (this.count < this.max) { // 最大并发任务处理this.runWork(promiseCreator)} else {this.queue.push(promiseCreator)}})}runWork(promiseCreator) {this.count++promiseCreator().then(() => {promiseCreator.resolve()this.count--if (this.queue.length) {this.runWork(this.queue.shift())}})}
}

题目二

实现一个带并发限制的异步调度PromiseQueue,保证同时运行的任务最多有N个且按优先级运行任务。完善下面代码中的PromiseQueue类,使以下程序能正确输出

link1start
link2start
link3start
link2end
high prioritystart
link1end
link5start
link3end  
link4start
high priorityend
link4end
link5end

const urls = [{info: 'link1',time: 3000,priority: 1}, {info: 'link2',time: 2000,priority: 2}, {info: 'link3',time: 3000,priority: 3}, {info: 'link4',time: 2000,priority: 2}, {info: 'link5',time: 5000,priority: 5}
]
function loadImg(url) {return new Promise((resolve, reject) => {console.log(url.info + 'start')setTimeout(() => {console.log(url.info + 'end')resolve()}, url.time)})
}
class PromiseQueue {}
const q = new PromiseQueue({concurrency: 3
})
const formatTask = (url) => {return {fn: () => loadImg(url),priority: url.priority}
}
urls.forEach(url => {q.add(formatTask(url))
})
const highPriorityTask = {priority: 10,info: 'high priority',time: 2000
}
q.add(formatTask(highPriorityTask))

 答案

class PromiseQueue {constructor(options = {}) {this.concurrency = options.concurrency || 1;this.currentCount = 0this.pendingList = []}add(task) {this.pendingList.push(task)this.run()}run() {if (this.pendingList.length === 0) {return;}if (this.concurrency === this.currentCount) {return;}this.currentCount++const { fn } = this.pendingList.sort((a, b) => b.priority - a.priority).shift()fn().then(this.completeOne.bind(this)).catch(this.completeOne.bind(this))}completeOne() {this.currentCount--this.run()}
}

递归输出

题目一

实现compose函数使下面的代码输出顺序为1,2,3,3.3,2.2,1.1 。

let middleware = []
middleware.push((next)=>{console.log(1)next()console.log(1.1)
})
middleware.push((next)=>{console.log(2)next()console.log(2.2)
})
middleware.push((next)=>{console.log(3)next()console.log(3.3)
})
let fn = compose(middleware)
fn()

这里观察输出1后执行next,然后输出2,执行next在到3,然后3.3,回到2.2,再回到1.1,这里明显为一个递归调用,传入的参数next为递归的函数,每次调用便会执行下一个函数。 

 答案

function compose(...args){let index = 0;return function fn() {if(args[0].length<=index){return;}return args[0][index++](fn)}
}
function compose(middlewares) {const copyMidlewares = [...middlewares];let index = 0const fn = () => {if (index >= copyMidlewares.length) {return ;}const middlewares = copyMidlewares[index];index++;return middlewares(fn)}return fn;
}

Promise相关

题目一

编写Promise.all和Promise.race方法。

答案

Promise.all = (arr) => {if (!Array.isArray(arr)) {return;}let counter = 0;let result = []return new Promise((resolve, reject) => {arr.forEach((item, index) => {Promise.resolve(item).then(value => {result[index] = value;counter++;if (counter === arr.length) {resolve(result);}}).catch(err => {reject(err)})})});
}
Promise.rRace = function (arr) {if (!Array.isArray(arr)) {return;}return new Promise((resolve, reject) => {arr.forEach(v => {Promise.resolve(v).then(value=>{resolve(value)}).catch(err => reject(err))})})
}

占用空间大小

题目一

1.计算一个变量占用的字节数(string占2字节,boolean占4字节,number占8字节)

注意

1.对象的属性值也占用字

2.相同的引用只能算一次

答案

const set = new Set()
function sizeOfObject(object) {if (object == null) {return 0}let bytes = 0;const properties = Object.keys(object)for (let i = 0; i < properties.length; i++) {const key = properties[i]if (typeof object[key] === 'object' && object[key] !== null) {if (set.has(object[key])) {bytes += calculator(key)continue}set.add(object[key])}bytes += calculator(key)bytes += calculator(object[key])}return bytes
}
function calculator(object) {switch (typeof object) {case 'string': {return object.length * 2}case 'boolean': {return 4}case 'number': {return 8}case 'object': {if (Array.isArray(object)) {return object.map(calculator).reduce((res, current) => res + current, 0)}return sizeOfObject(object)}}
}

渲染虚拟节点

题目一

1.将如下数据格式的虚拟dom为真实dom

const vnode = {tag: 'DIV',attrs: {id: 'app'},children: [{tag: 'SPAN',children: [{tag: 'A',children: []}]},{tag:'SPAN',children:[{tag:'A',children:[]},{tag:'',children:[]}]}]
}

答案

function render(vnode){if(typeof vnode === 'number'){vnode = String(vnode)}if(typeof vnode=== 'string'){return document.createTextNode(vnode);}const  element = document.createElement(vnode.tag);if(vnode.attrs){Object.keys(vnode.attrs).forEach(key=>{element.setAttribute(key,vnode.attrs[key])})}if(vnode.children.length){vnode.children.forEach(v=>{element.appendChild(render(v))})}return element
}

实现for of

题目一

如何使对象实现for of。

答案

方法一

obj[Symbol.iterator]=function(){const _this = this//也可使用: keys = Object.getOwnPropertyNames(this)const keys = Object.keys(this)let index = 0return {next(){return {value: _this[keys[index++]],done: index>keys.length}}}
}

方法二

obj[Symbol.iterator] = function *(){for(let prop in this){yield this[prop]}
}

 

http://www.ritt.cn/news/16214.html

相关文章:

  • 万网发布网站外贸网站推广公司
  • wordpress去掉版权信息深圳seo优化服务
  • 网站服务公司代买空间有无义务seopc流量排行榜企业
  • 网站建设教程哪家公司好seo平台有哪些
  • xampp wordpress服务器深圳seo优化推广
  • 简约大气商务网站bt蚂蚁磁力搜索天堂
  • 家具网站建设策划方案电话营销销售系统
  • 简单的网站建设方案seo sem是什么
  • 怎么更改网站栏目idseo排名优化收费
  • 杭州网站建设公司有哪几家无锡营销型网站制作
  • 优秀定制网站建设案例推广营销软件app
  • 打鱼网站开发seo关键词布局
  • 吉安做网站平台seo什么意思
  • 网站建设费长期待摊费用在线生成网页网站
  • 龙岩网站建设行情推广项目网站
  • 创新的做pc端网站热搜榜排名前十
  • 集团网站开发湖南发展最新消息公告
  • b2b免费网站有哪些百度seo推广首选帝搜软件
  • 陵水网站建设装修设计公司阿里指数在线查询
  • 网站建设faq系统指什么sem搜索
  • 公司网站制作方案哪些网站可以免费推广
  • 深圳市网站建设制作设计平台新乡网站seo
  • 保定比较好的网站建设公司电商怎么做新手入门
  • 网站推广咋做的2020国内十大小说网站排名
  • 西部数码网站管理助手 xpapp开发自学教程
  • wordpress 分类链接郑州seo排名哪有
  • 做网站和做微信小程序windows优化大师是电脑自带的吗
  • 上海青浦区网站建设公司超级软文
  • 有个可以做图片的网站seo优化排名工具
  • 公司用wordpress建站用花钱百度在线翻译