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

JavaScript 事件轮询 | 宏任务队列 微任务队列 | async await,setTimeOut,promise的执行顺序 事情起因是这样的,我吹了个牛 然后小哥哥就真的给了我一个面试题!!!结果我发现自己不会!!!(╯ ̄Д ̄)╯╘═╛ 不过现在会了,查漏补缺了。这篇文章主要涉及JavaScript的宏任务队列和微任务队列相关内容,后续有机会的话我可能整理一下JavaScript的异步? 首先来思考一下,这个代码输出什么。 const p = new Promise(function(resolve, rej... 阅读详情

异步程序设定场景

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 机制
前端同步异步-setTimeout-Promise-async-await 是JavaScript中的一个定时器函数,主要作用是在指定的延迟时间(以毫秒为单位)后执行一次给定的函数或代码段。Promise在JavaScript中用于处理异步操作的结果。它是一个对象,用于包装一个还未完成的异步操作,可以在操作完成后进行相应的结果处理。async/await是JavaScript中处理一步操作的一种更简洁、更易于理解的语法糖,它是基于Promise构建的。 阅读详情

相关推荐

【JS】js中同步异步,Promise,Async/await, Observable

同步与异步 由于js是用来控制DOM的,所以js必须是单线程的,因为如果多个线程同时控制DOM操作,那么页面必然就乱套了。为了避免复杂性,所以它是单线程的。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。 虽然js单线程的,但是浏览器内部不是单线程的,以此js才实现了异步。一些I/...

渐墨深的博客 3153

数据结构-使用ts创建一个队列

队列遵循先进先出

poppy995的博客 1012

queue-ts:基于并发的基于promise的工作队列,并发性有限

队列ts 基于承诺的并发性受限的工作人员队列。 用法 // Create a queue with two worker threads const queue = new Queue ( 2 ) ; queue . onEmpty ( ( ) => { console . log ( 'done' ) ; } ) ; // Adding tasks to do queue . add ( function task1 ( ) { } ) ; queue . add ( function task2 ( ) { } ) ; queue . add ( function task3 ( ) { } ) ; queue . add ( function task4 ( ) { } ) ; queue . add ( function task5 ( ) { } ) ; 计划任务将被执行

JavaScript + TypeScript 实现并发队列

JavaScript + TypeScript 实现并发队列。使用 JavaScript 异步,实现任务的并发性。

weixin_64433668的博客 1431

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1639

用Cursor+Node.js零代码搭建健康数据仪表盘:从数据录入到可视化全流程

本文详细介绍了如何利用Cursor AI编程助手和Node.js,无需手动编写代码,即可构建个人健康数据仪表盘的全流程。通过自然语言指令,实现从数据录入、存储到动态图表可视化的完整系统,展示了AI驱动开发在降低技术门槛、提升开发效率方面的强大能力。

gitlab7runner的博客 700

Typescript队列、栈、集合的实现

#队列 先进先出 export class Queue<T> { private elements: Array<T>; private _size: number | undefined; public constructor(capacity?: number) { this.elements = new Array<...

牵蜗牛看世界的专栏 6692

实用工具抓取youtube热门数据

YouTube作为全球第二大搜索引擎,2024年日均视频播放量突破50亿次,头部创作者单月广告分成可达百万美元量级。但对数据分析者而言,其反爬机制堪称业界最严: ‌反爬技术升级‌:Google部署的Botguard系统可检测异常流量,触发机制包括: 单IP每小时请求超过50次即封禁 检测Headless浏览器指纹(如Chrome的navigator.webdriver属性) 动态加载内容(如评论数据需滚动页面3次后加载) ‌数据价值维度‌:某MCN机构研究显示,前100热门视频的标题关键词复用率高达67%

26万+

Redis + NodeJS 实现一个能处理海量数据的异步任务队列系统

关于本文 作者:@jrainlau 原文:https://segmentfault.com/a/1190000037567355在最近的业务中,接到了一个需要处理约十万条数据的需求。这些...

程序员成长指北 1873

RK3588平台开发系列讲解(USB篇)UAC初识

📢本篇将介绍RK3588平台`UAC`的配置使用。

内核笔记 3886

【AUTOSAR-COM】-5.2-“Deadline Monitoring超时监控”-2-基于IPdu实现

目录 1 在CFG中配置Deadline Monitoring超时监控 1.1 参数说明 1.2 生成代码差异 2 通过一段测试代码看Deadline Monitoring超时监控 3 使用CAN盒观察Deadline Monitoring实际测试效果 3.1 Case 1:ECU开始工作时,没有收到Frame 3.2 Case 2:ECU工作中,接收的Frame丢失、 4 小结 5 结尾 关键字: DM=Deadline Monitoring超时监控 ComFirstTime...

「汽车电子助手」的博客 1788

关于async/await、promise和setTimeout执行顺序

前段时间领导给我们出了一道题,关于async/await、promise和setTimeout的执行顺序,网上查了查资料,这是头条的一道笔试题,记录一下,加深理解。 题目如下: async function async1() { console.log('async1 start'); await async2(); console.log('asnyc1 end'); } async...

yun_hou的博客 3万+

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 918

js中的promise、async/await 用法,详解async、await 语法糖,js中的宏任务和微任务(保姆级教程二)

js、promise、await、async

zhangfuping123456789的博客 1万+

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2224

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

异步回调Async Await与Promise区别

async await 它是基于promise的,为什么es6新增了这个?为了解决大量复杂不易读的Promise异步的问题才出现的,首先async await是有密切联系的!下面分别来介绍下它们的之前的关系! 1、async async必须声明的是一个function! async test= function () { return "我是个promise返回值" }; //语法错误 async必须声明的是一个function async 是“异步”的意思,所以应该很好理解 async

5049

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

鸿蒙 taskpool、Promise 和 async/await的区别

本文对比了HarmonyOS开发中三种异步处理方式:Promise、async/await和taskpool。Promise是ECMAScript6标准,通过状态机和微任务队列解决回调地狱问题;async/await是Promise的语法糖,用同步写法处理异步流程;taskpool则是HarmonyOS提供的线程池API,用于执行CPU密集型任务避免阻塞UI线程。三者定位不同:Promise/async/await处理逻辑并发,taskpool实现物理并发。实际开发中可组合使用,如用async/await等

梦想不只是梦与想的博客 1722

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

前端的同步异步和promise、async、await的使用

同步和异步 ​ 为什么js分同步和异步? 同步 ​ JavaScript是一门单线程的语言,因此,JavaScript在同一个时间只能做一件事,单线程意味着,如果在同个时间有多个任务的话,这些任务就需要进行排队,前一个任务执行完,才会执行下一个任务,会造成运行阻塞,严重的话会造成页面长时间无响应,js执行时间过长等 异步 ​ 异步任务是指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,...

weixin_45532305的博客 4867

一篇文章带你学会:js异步任务+Promise+async/await语法糖

一篇文章带你学会:js异步任务+Promise+async/await语法糖

H30919的博客 1564

promise+async/await+任务队列

promise+事件队列

m0_51244077的博客 1801

Web前端之JavaScrip异步和同步、promise、async、await

Web前端之JavaScrip异步和同步、promise、async、await

优快云博客主页地址:https://mengjian.blog.youkuaiyun.com/ 1467

async/await、promise和setTimeout执行顺序

async/await、promise和setTimeout执行顺序

效率开发者手札 3467

从 Promise 到 async/await 的终极指南、ArkTS、TS、JS异步任务全面解析

任务是完成某项操作要执行的一段代码,一个任务可以执行任何特定操作的代码,可能是简单的打印语句、复杂的算法处理、网络请求或 I/O 操作等。这些任务的执行时间各不相同,打印语句执行时间通常很短,而网络请求和 I/O 操作可能耗时较长。如果所有的任务按照顺序执行,耗时较长的任务可能会阻塞线程,导致整体性能下降,进而影响用户体验。为了更高效地管理和执行这些任务,JavaScript将要执行的任务分为同步任务和异步任务使得JavaScript能够在单线程环境中有效地处理耗时操作,而不阻塞主线程。

YunWQ的博客 1081

js中promise的异步机制以及async详解

promise是js中的一个对象,可以使用构造函数还构造一个promise对象。Pending(待定):初始状态,表示异步操作尚未完成(即操作还在进行中)。Fulfilled(已完成):表示异步操作已经成功完成,并返回一个结果。Rejected(已拒绝):表示异步操作失败,并返回一个错误原因。介绍并不算全面,查阅了各方资料同时借助GPT的帮助学习整理得到,错误请指正。

2301_76830653的博客 1376
上一篇: 前端小技巧: 实现一个比较两个对象是否相等的方法
下一篇: 前端小技巧: 设计一个简版前端统计 SDK
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值