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

源码之家 网站模板栾城seo整站排名

源码之家 网站模板,栾城seo整站排名,创意设计绘画,装修设计软件推荐代码 /*** 懒汉式 LazyMan* description* 注意:* 1. 在每次执行的任务里面调用next(任务按顺序执行),而不是添加任务后执行next(立即执行task,多个任务会同时触发)* 2. 使用setTimeout确保构造函数执行完再启动任务队列*/ class LazyMan {con…

代码

/*** 懒汉式 LazyMan* @description* 注意:* 1. 在每次执行的任务里面调用next(任务按顺序执行),而不是添加任务后执行next(立即执行task,多个任务会同时触发)* 2. 使用setTimeout确保构造函数执行完再启动任务队列*/
class LazyMan {constructor(name) {this.name = name// 任务队列this.tasks = []const task = () => {console.log(`Hi I am ${name}`);this.next();}this.tasks.push(task)// 确保构造函数执行完再启动任务队列setTimeout(() => {this.next()}, 0)}// 启动一次任务队列(执行第一个任务)next() {const task = this.tasks.shift()if (task) task()}eat(food) {const task = () => {console.log(`Eat ${food}~`);this.next();}this.tasks.push(task)return this}sleep(seconds) {const task = () => {setTimeout(() => {console.log(`Wake up after ${seconds}s`);this.next();}, seconds * 1000)}this.tasks.push(task)return this}sleepFirst(seconds) {const task = () => {setTimeout(() => {console.log(`Wake up after ${seconds}s`);this.next();}, seconds * 1000)}this.tasks.unshift(task)return this}
}// new LazyMan("Hank").eat("dinner");
// Hi I am Hank
// Eat dinner~// new LazyMan("Hank").sleep(2).eat("dinner");
// Hi I am Hank
// (2秒后) Wake up after 2s
// Eat dinner~// new LazyMan("Hank").sleepFirst(2).eat("dinner");
// (2秒后) Wake up after 2s
// Hi I am Hank
// Eat dinner~

在每次执行的任务里面调用next,而不是添加任务后执行next

每次执行的任务里面调用 next,确保任务按顺序执行。

如果添加任务后就立刻执行next,会导致每一个加入的任务都立刻执行,违背了串行,类似于并行执行。

使用setTimeout确保构造函数执行完再启动任务队列

先看构造函数里如果 立刻调用 this.next() 会怎样

class LazyMan {constructor(name) {this.tasks = []const task = () => {console.log(`Hi I am ${name}`)this.next()}this.tasks.push(task)// ⚠️ 这里如果立刻调用 nextthis.next()}next() {const task = this.tasks.shift()if (task) task()}eat(food) {const task = () => {console.log(`Eat ${food}`)this.next()}this.tasks.push(task)return this}
}new LazyMan("Tom").eat("apple")

执行顺序

  1. new LazyMan("Tom") 执行构造函数。

    • tasks.push("Hi I am Tom")
    • 立刻 next() → 执行 “Hi I am Tom”
  2. 构造函数还没结束,已经执行掉第一个任务了。

  3. 接着调用 .eat("apple"),才把 Eat apple 放到队列里。

    • 但是此时队列已经空了(第一个任务执行完时队列已经没东西了)。
    • 所以 Eat apple 永远不会执行。

👉 结果:

Hi I am Tom

而不是期望的:

Hi I am Tom
Eat apple

这就是「来不及入队」的意思。


再看 setTimeout(..., 0) 的情况

class LazyMan {constructor(name) {this.tasks = []const task = () => {console.log(`Hi I am ${name}`)this.next()}this.tasks.push(task)// ✅ 延迟到构造函数执行完后才启动队列setTimeout(() => {this.next()}, 0)}next() {const task = this.tasks.shift()if (task) task()}eat(food) {const task = () => {console.log(`Eat ${food}`)this.next()}this.tasks.push(task)return this}
}new LazyMan("Tom").eat("apple")

执行顺序

  1. new LazyMan("Tom") 执行构造函数。

    • tasks.push("Hi I am Tom")
    • setTimeout(..., 0) 安排一个异步任务(等同步代码执行完再跑)。
  2. 构造函数执行完毕,继续执行 .eat("apple")

    • tasks.push("Eat apple")
  3. 同步代码跑完,进入事件循环 → 执行 setTimeout 回调里的 this.next()

    • 这时队列是:[Hi I am Tom, Eat apple]
    • 所以会先执行 "Hi I am Tom",再执行 "Eat apple"

👉 结果:

Hi I am Tom
Eat apple

完全符合预期。

http://www.dtcms.com/a/591832.html

相关文章:

  • 个人门户网站建设流程wordpress图片显示缩略图
  • 课程网站开发背景和意义求网址直接能看的2021
  • 做服务网站个人域名备过案了做电影网站会查吗
  • 简洁物流网站模板学wordpress要多久
  • 建网站卖虚拟资源需要怎么做建筑人才网筑才网
  • 网站建设的需求客户公司变更登记申请表
  • 卫计网站建设工作总结指定网站建设前期规划方案
  • 科技网站内容设计湖南中霸建设公司官网
  • 网站怎么做聚合深圳鸿天顺网站建设
  • 网站建设 上传媒网站设计
  • 接网站开发私活如何签合同动漫制作专业名人作品展示
  • 网站建设类公网络营销促销形式
  • 怎么做免费的网站宁波网站建设详细策划
  • 石狮网站定制国内类似wordpress
  • 如何建设音乐网站龙岩天宫山海拔高度多少
  • 招商网站怎么做旅游网站组织结构图怎么做
  • 建设银行网网站打不开百度对wordpress
  • 南京市网站seo整站优化公司网站做优化少钱
  • flash 网站搜索引擎营销推广方案
  • 网站建设价格多少深圳网站设计服务找哪家
  • 万户做网站怎么样校园二手交易网站开发
  • 浏览器怎么做能不拦截网站西安网络营销公司排名
  • 深圳做网站的网络文化宣传 加强网站建设 创办网站
  • 宜昌做网站公司天津网站建站
  • 开发app的网站免费咨询电话
  • 云浮营销建站公司营销团队找产品合作
  • 周口建设局网站工地模板
  • 2小时wordpress建站百度手机端排名
  • 用织梦做网站费用机械加工网站有哪些
  • 手机网站开发一个多少钱百度应用商店下载安装