关于js异步队列,搞懂这一篇就够了!

JS 异步队列 hello 好久没学博客了 最近实习忙项目 以及规划行程(哈哈哈我就是爱旅游的孩子)我们常说JS是单线程的,那到底什么是单线程?什么是同步?什么是异步?如何解决回调地狱??同步:你在做一件事情,不能同时去做另外一件事。 异步:你在做一件事情,这件事可能会耗时很久,而此时你可以在等待的过程中,去做另外一件事。比如煮开水这件事吧..在这过程,你担心水沸了而不去做其它事情,就等到水沸腾,那就是同步。 阅读详情

前言、今天逛社区,无意间看到一道面试题,觉得很有意思,特此记录一下,题目如下

function LazyMan() {} //设计LazyMan函数满足下列需求
LazyMan('Tony');
// Hi I am Tony

LazyMan('Tony').sleep(10).eat('lunch');
// Hi I am Tony
// 等待了10秒...
// I am eating lunch

LazyMan('Tony').eat('lunch').sleep(10).eat('dinner');
// Hi I am Tony
// I am eating lunch
// 等待了10秒...
// I am eating diner

LazyMan('Tony').eat('lunch').eat('dinner').sleepFirst(5).sleep(10).eat('junk food');
// Hi I am Tony
// 等待了5秒...
// I am eating lunch
// I am eating dinner
// 等待了10秒...
// I am eating junk food

个人觉得这个题目还是很有意思的,结合了Promise,async/await,和js事件循环,异步队列的知识。

捣鼓了半个小时,中间一直修改优化,最终实现了一个版本,有兴趣的可以参考一下:

function LazyMan(name) {
	if(!(this instanceof LazyMan)) return new LazyMan(name)
	this.name = name 
	this.isExecute = false //队列是否开始执行
	this.cache = [] //缓存队列
	this.init()  //初始化需要做的事
}
LazyMan.prototype = {
	init: function () {
		console.log(`I am ${this.name}`)
	},
	eat: function(type) {
		this.cache.push(async () => {
			console.log(`${this.name} have ${type}`)
		})
		this.notify()
		return this;
	},
	sleep: function (t=0) {
		this.cache.push(async () => {
			return new Promise(res => {
				setTimeout(() => {
					res()
				},t)
			})
		})
		this.notify()
		return this
	},
	firstSleep: function  (t) {
		this.cache.unshift(async () => {
			return new Promise(res => {
				setTimeout(() => {
					res()
				},t)
			})
		})
		this.notify()
		return this
	},
	notify: function() {
		if(!this.isExecute) {
			this.isExecute = true
			setTimeout(() => {
				this.execute()
			},0)
		}
		return this
	},
	execute: async function (i) {
		i = i || 0
		if(i > this.cache.length-1) {
			this.isExecute = false
            this.cache = []
			return;
		}
		await this.cache[i]()
		this.execute(i+1)
	}
}

 

只看这一篇就够了:定时器与延时器异步执行的本质 定时器与延时器的执行,保你看这一篇就会了 阅读详情

相关推荐

Cursor集成Claude 4.6免费版:本地IDE合规调用指南

大语言模型编程助手(LLM Copilot)已成为现代开发标配,其核心能力依赖于上下文理解、代码推理与结构化输出等关键技术原理。Anthropic官方提供的Claude系列模型,尤其Claude 4.6,凭借200K超长上下文、tool use函数调用和严格可控的API设计,在工程实践中展现出显著技术价值。该能力可无缝嵌入本地IDE环境,支撑代码解释、跨文件分析、单元测试生成等高频开发场景。本文聚焦Cursor这一开源可审计IDE,详解如何合规复用Anthropic免费tier接口(/v1/messages

weixin_34095889的博客 537

js异步串行队列

处理一些避免异步并行的情况。

hahadekuai的专栏 415

燧原科技云燧ESL64-O超节点:国产AI芯片与OEX光互联架构解析

分布式AI训练通过将计算任务拆分到多个节点并行执行来加速模型训练,其核心原理涉及数据并行和模型并行等策略。在技术价值层面,分布式训练能显著提升大规模深度学习任务的效率,但传统GPU集群常因网络通信瓶颈导致性能受限。OEX光互联架构作为解决通信瓶颈的关键创新,采用硅光技术实现高带宽、低延迟的节点内互联,优化了AI训练中的集合操作。这种硬件级优化特别适用于千亿参数大模型训练和科学计算等场景,能有效降低AI集群的总体拥有成本(TCO)。云燧ESL64-O超节点正是基于国产自研AI芯片与OEX架构的集成方案,为大规

weixin_29071809的博客 370

JS解决异步编程的多种方法

详解JS异步编程的多种方法

茴香馅饺子~的博客 1677

wps js宏获取工作簿、工作表、单元格的值、链接转图片、单元格区域数据转二维数组、保存工作簿的常用Excel操作

wps js宏入门看这里,我写了常用的js操作Excel的方法:获取工作簿对象、获取工作表对象、获取单元格的值、链接转图片、生成条形码图片、单元格区域数据转二维数组方法、保存工作簿、弹出输入框、YesNo选择框,助你从VBA转战JS。

huaermeier的博客 3万+

音频——DAC 性能测试

codec DAC 性能测试方法

tyustli 2235

js中同步队列、异步队列

单线程多线程 单线程模型:历史延续,JS是单线程模型,它在同一时间只能执行一个任务,其他的任务在后排队等待。多线程模型:一次执行多个任务。 你的电脑开了很多的软件,打开任务管理器其实可以看到,这些软件都会开各自的进程,这些进程里有分为很多的线程,这些线程就相当于这个软件里的很多引擎,他们可以同时干着很多的事情。就像你开车一样,方向盘,发动机,空调等等,把汽车比做进程,那这些东西就是线程,他们可以同时干着自己的事情。 js中同步异步 同步:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的

cai_niao5623的博客 2114

某城商银行生产容器云平台详细设计方案分享及经验总结

AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。

qq_61890005的博客 856

构建 JS 中的异步任务队列和发布-订阅架构

在 JS 中构建异步任务队列和发布-订阅架构可以有效利用 JavaScript 的并发模型和性能。 ### 1. 异步任务队列: 对于异步任务队列,你可以使用 async 库,但我们可以使用原生 JavaScript 的 Promise 和 setTimeout 来构建一个简单的任务队列。

hongfu951的专栏 1518

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 115

华为od 面试八股文_前端_01_含答案

华为od 面试八股文_前端_01_含答案

MISAYAONE的博客 2748

JS异步原理

JavaScript作为单线程语言,有两种任务的执行模式:同步模式和异步模式。同步模式就是代码自上而下依次执行。在异步模式下,异步任务又分为微任务和宏任务两种。而微任务和宏任务执行的事件队列也不同。

qq_50583932的博客 574

读懂ARM汇编程序,你只差这篇!保姆级教程(附完整示例剖析)!

ARM汇编中的符号、标号、伪操作有哪些?C语言和汇编语言如何混合编程?GNU ARM汇编和ARM汇编的区别有哪些?

车载系统攻城狮 1万+

JS 异步队列的实现

这可能是个比较深的话题。何谓异步?   笼统地说,异步在javascript就是延时执行。严格来说,javascript中的异步编程能力都是由BOM与DOM提供的,如setTimeout,XMLHttpRequest,还有DOM的事件机制,还有HTML5新增加的webwork, post...

chuban8607的博客 1660

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript 异步队列实现及拓展

简单介绍回顾一下,因为有同学不经常用,肯定会有遗忘。// 一个简单的栗子,介绍它的用法// 12return y;// 2// {value: 12, done: true}复制代码首先生成器其实就是一个通过函数体内部定义迭代算法,然后返回一个 iterator 对象。关于iterator,可以看我另一篇文章。gen 执行返回一个对象 g,而不是返回结果。

weixin_64051447的博客 778

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【玩转Vue.js】异步队列那点事

引言: 前面核心篇说过Vue 运行时的核心主要包括数据初始化、数据更新、异步队列、DOM渲染这几个部分,理解异步队列是理解数据更新非常重要的一部分,本文讲一下Vue的异步队列的思路以及实现原理,顺带讲一下 Vue 的 $nextTick。 一、Vue的异步队列是什么? 要弄懂这个概念首先看一个例子: <div id="example"> <div&g...

bandongli1265的博客 380

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

javascript 多线程异步队列

首先,你得知道 jQuery.Deferred 的大致用法,然后,我们进入正题吧: 库代码: /*! * 多线程异步队列 * 依赖 jQuery 1.8+ (如果你用的是 1.6或1.7, 只要将源码中的 then方法替换为pipe方法 即可) */ /** * @n {Number} 正整数, 线程数量 */ function Queue (n) {...

dgx2006的博客 207

Js 主线程和异步队列哪个先执行

JavaScript 是单线程语言,通过事件循环(Event Loop)机制来处理同步和异步任务。

大东码字 602

js异步队列函数

先上源代码: 8.31 虽然很努力的维护,但是还是出现了严重的BUG,这版修复。 7.25 修复num参数为1不能执行的错误。 7.24 发布。 /** * 这是一个异步队列处理程序 * @param list * 这个必须是数组 * @param fn * 每元素处理的方法,fn默认会传入当前操作的元素以及元素的索引下标 *

hahadekuai的专栏 1942

jQuery粗略源码解析3 异步队列

异步队列模块用于异步任务和回调函数的解耦,为ajax模块,队列模块提供基础功能。 jQuery.ajax()负责创建异步队列,发送ajax请求,解析响应内容,回调交由异步队列管理。当ajax()请求成功、失败、完成时,将根据响应状态和解析结果,调用一部队列上相应的方法。 异步队列模块包括三部分:1 jQuery.callbacks() 回调函数列表 2 jQuery.Defferred 异步...

u014694247的博客 286

单线程和异步队列

setTimeout和setInterval是JS内置的两个定时器,使用很简单,但这两个方法背后的原理却不简单。 我们知道,JS是单线程语言,在浏览器中,当JS代码被加载时,浏览器会为其分配一个主线程来执行任务(函数),主线程会形成一个全局执行环境,执行环境采用栈的方式将待执行任务按顺序依次来执行。 但在浏览器中有一些任务是非常耗时的,比如http请求、定时器、事件回调等,为了保证其他任务的执

angybaby97的博客 446

JavaScript 异步队列及Co实现

引入 队列对于任何语言来说都是重要的,io 的串行,请求的并行等等。在 JavaScript 中,又由于单线程的原因,异步编程又是非常重要的。昨天由一道面试题的启发,我去实现 JS 中的异步队列的时候,借鉴了 express 中间件思想,并发散到 co 实现 与 generator,以及 asyncToGenerator。 本次用例代码都...

weixin_33762130的博客 211

js语句放入异步队列的时机是哪个?

JavaScript的执行环境(如浏览器或Node.js)会不断地从异步队列中取出任务并执行,这就是所谓的“事件循环”。总的来说,当一个异步操作完成(如定时器到达、Promise状态改变、HTTP请求完成、接收到消息或DOM事件被触发)时,相关的回调函数或处理函数就会被放入异步队列。中的函数会被放入异步队列(也被称为“任务队列”或“事件队列”)。在JavaScript中,当你调用某些特定的异步API时,相关的回调函数或Promise的。

王铁柱666的博客 197

面试题-实现异步队列

实现异步队列 实现异步队列函数,使其能够按照参数顺序依次输出 function fun1(cb) { setTimeout(function() { console.log('fun1'); cb(); }, 3000) } function fun2(cb) { setTimeout(function() { console.log('fun2'); cb(); }, 1000) } function fun3(cb) { setTimeout(func

xiaojinglyd的博客 273

玩转Vuejs--异步队列那点事

引言: 前面核心篇说过Vue 运行时的核心主要包括数据初始化、数据更新、异步队列、DOM渲染这几个部分,理解异步队列是理解数据更新非常重要的一部分,本文讲一下Vue的异步队列的思路以及实现原理,顺带讲一下 Vue 的 $nextTick。 一、Vue的异步队列是什么? 要弄懂这个概念首先看一个例子: <div id="example"> <div>{{ ...

weixin_33840661的博客 854

一篇文章彻底搞懂异步,同步,setTimeout,Promise,async

之前翻看别的大佬的博客看到了关于setTimeout,promise还有async执行顺序的文章。观看了几篇之后还是没有怎么看懂,于是自己开始分析代码,并整理了此文章,我相信通过此文章朋友们能对异步同步还有,setTimeout,Promise,async这些内容了然于胸,接下来让我们走入正题: ...

吴小迪的博客 5万+
上一篇: 聊聊React的生命周期
下一篇: 手动实现一个Promise
feral_coder
博客等级 码龄9年 19粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值