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

前端小技巧: 写一个异步程序示例, 使用任务队列替代promise和async/await等语法糖

异步程序设定场景

1 )场景设定

  • 可以使用懒人每做几件事,就要休息一会儿,并且不会影响做事的顺序这种场景来模拟
  • 定义单例名称为: lazyMan
  • 支持 sleep 和 eat 两个方法
  • 支持链式调用

2 ) 调用示例

const lm  = new LazyMan('www')
lm.eat('苹果').eat('香蕉').sleep(5).eat('葡萄')

分析与设计

  • 上述是基于异步实现一个"懒人做事"的调用过程
  • 设计
    • 由于有sleep功能,函数不能直接在调用时触发
    • 初始化一个列表,把函数注册进去
    • 由每个item触发next执行(遇到sleep则异步触发)

代码实现

lazyMan.ts 代码如下

class LazyMan {
  private name: string
  private tasks: Function[] = [] // 任务列表

  constructor(name: string) {
    this.name = name
	// 这里必须异步触发
    const timer = setTimeout(() => {
	   	clearTimeout(timer)
	   	this.next()
	})
  }
  
  // 用于执行队列中的下一项任务
  private next() {
    const task = this.tasks.shift() // 取出当前 tasks 的第一个任务
    if (task) task()
  }

  // 定义吃的方法
  eat(food: string) {
    const task = () => {
      console.info(`${this.name} eat ${food}`)
      this.next() // 立刻执行下一个任务
    }
    this.tasks.push(task)
    return this // 链式调用
  }
  
  // 定义睡的方法
  sleep(seconds: number) {
    const task = () => {
      console.info(`${this.name} 开始睡觉`)
      setTimeout(() => {
        console.info(`${this.name} 刚刚睡了 ${seconds} s, 正在执行下个任务中 ...`)
        this.next() // 异步执行
      }, seconds * 1000)
    }
    this.tasks.push(task)
    return this // 链式调用
  }
}

const lm  = new LazyMan('小王')
lm.eat('苹果').eat('香蕉').sleep(1).eat('葡萄').sleep(2).eat('大米');
  • 这里使用任务队列, 异步触发next
  • 这个示例是替代promise和async/await的一种方法
  • 底层是基于 event loop 机制

http://www.kler.cn/a/162162.html

相关文章:

  • C# 模拟浏览器自操作(自动化办公)
  • 【Pikachu】目录遍历实战
  • Redis高可用-主从复制
  • 解决表格出现滚动条样式错乱问题
  • 【STM32】基于SPI协议读写SD,详解!
  • 笔记 | image may have poor performance,or fail,if run via emulation
  • Node CLI 之 Commander.js (1)
  • 性能测试工具:Jmeter介绍
  • 什么是网站?
  • Zabbix自定义飞书webhook告警媒介1
  • 设计模式基础——工厂模式剖析(2/2)
  • 使用 python ffmpeg 批量检查 音频文件 是否损坏或不完整
  • 备忘录模式 rust和java的实现
  • 机器学习实战:预测波士顿房价
  • Linus:我休假的时候也会带着电脑,否则会感觉很无聊
  • [论文阅读]Sparse Fuse Dense
  • 快速排序的新用法
  • CleanMyMac软件2024最新Mac系统清理工具实用性测评
  • FFmpeg数据结构AVFrame
  • SpringBoot项目访问resources下的静态资源
  • 企业计算机服务器中了360勒索病毒如何解密,勒索病毒解密数据恢复
  • 十五届蓝桥杯分享会(一)
  • React中每次渲染都会传入一个新的props.children到子组件?
  • Sentinel基础知识
  • WT588F02B单片机语音芯片在磁疗仪中的应用介绍
  • 【算法每日一练]-结构优化(保姆级教程 篇6 分块,倍增)#HDU4417超级马里奥 #poj2019玉米田 #POJ3368频繁值