前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >javaScript实现sleep函数(红绿灯实现思路)

javaScript实现sleep函数(红绿灯实现思路)

原创
作者头像
can4hou6joeng4
发布于 2023-11-29 09:15:23
发布于 2023-11-29 09:15:23
1K00
代码可运行
举报
运行总次数:0
代码可运行

sleep

=====

js中是没有sleep函数,本文模拟sleep函数实现,比较常见常见的问题就是红路灯。sleep函数可以延迟程序的执行,程序执行过程中能够捕获到异常并抛出。

1.Promise实现


代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	function sleep(time) {
			return new Promise(resolve => {
				setTimeout(() =>{
					console.log(time, 'time')
					resolve()
				} 
				, time)
			})
		}

两种方式进行调用:

方式一

then回调横式调用,sleep(1000)执行完后再执行sleep(2000),sleep(2000)执行完后再执行sleep(3000)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		sleep(1000).then(
			() => {
				sleep(2000).then(
					() => {
						sleep(3000)
					}
				)
			}
		)

但是这种实现方式属于回调地狱,类似于用setTimeout实现的这种。虽然setTimeout也能实现sleep,但是不建议这么使用,一是不美,二是不易控制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setTimeout(()=>{
     //业务逻辑
     setTimeout(()=>{
            //业务逻辑
            setTimeout(()=>{
                 //业务逻辑
            },3000)
     },2000)
},1000)

方式二

优化一下上面Promise实现的代码,如下: Promise.resolve()将现有对象转为promise对象,相当于new Promise(resolve => resolve()),在then回调中执行sleep()方法,then回调会返回一个promise对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      const main = () => {
			Promise.resolve().then(() =>
				sleep(1000)
			).then(() =>
				sleep(2000)
			).then(() =>
				sleep(3000)
			).catch((error)=>
			 console.log('error')
			)
		}
		main();

2.generator构造器实现


代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	
	function sleep(time) {
			return new Promise(resolve => {
				setTimeout(() => {
					console.log(time, 'time')
					resolve()
				}, time)
			})
		}
	function* main(time) {
		yield sleep(time)
	}
    main(1000).next().value.then(()=>{
        console.log('1s后输出')
	})

在调用main函数(Generator函数)时,它不会执行,也不会返回结果,而是指向内部状态的指针对象(遍历器对象Iterator Object),只有调用next()才会使指针指向下一个状态。下图是Generator函数的数据结构

next()方法会执行generator的代码,其中 main(1000).next()是对象,有两个值,一个是key为value的执行后的promise对象,一个是done判断generator是否执行完,如果done为true,说明程序已经执行完了。 要处理,则如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	function sleep(time) {
			return new Promise(resolve => {
				setTimeout(() => {
					console.log(time, 'time')
					resolve()
				}, time)
			})
		}
	function* main(time) {
		yield sleep(time)`在这里插入代码片`
	}
	const test = () => {
			Promise.resolve().then(() =>
			    main(1000).next().value
			).then(() =>
				main(2000).next().value
			).then(() =>
				main(3000).next().value
			)
		}
	test();

需要注意的是,如果直接这么写,则会在第1s后输出,第2s后输出,第3s后输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	function sleep(time) {
			return new Promise(resolve => {
				setTimeout(() => {
					console.log(time, 'time')
					resolve()
				}, time)
			})
		}
	function* main(time) {
		yield sleep(time)
	}
        main(1000).next().value.then(()=>{
           console.log('第1s后输出')
	})
	main(2000).next().value.then(()=>{
           console.log('第12s后输出')
	})
	main(3000).next().value.then(()=>{
          console.log('第s后输出')
	})

3.async/await实现


用async/await使异步代码同步化,等await后面的函数执行完后再执行下面的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sleep(time) {
	return new Promise(resolve => {
		setTimeout(() => {
			console.log(time, 'time')
			resolve()
		}, time)
	})
}
async function main() {
	await sleep(1000)
	await sleep(2000)
	await sleep(3000)
}
main()

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript Promise
  我们都知道 JavaScript 是一种同步编程语言,上一行出错就会影响下一行的执行,但是我们需要数据的时候总不能每次都等上一行执行完成,这时就可以使用回调函数让它像异步编程语言一样工作。   像 NodeJS 就是采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着。但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着再执行下个回调,这样就会造成层层嵌套,代码不清晰,很容易进入“回调监狱”。。。   所以 ES6 新出的 Promise 对象以及 ES7 的 async、await 都可以解决这个问题。   Promise 是用来处理异步操作的,可以让我们写异步调用的时候写起来更加优雅,更加美观便于阅读。Promise 为承诺的意思,意思是使用 Promise 之后他肯定会给我们答复,无论成功或者失败都会给我们一个答复,所以我们就不用担心他跑了哈哈。   Promise 有三种状态:pending(未决定),resolved(完成fulfilled),rejected(失败)。只有异步返回时才可以改变其状态,因此我们收到的 Promise 过程状态一般只有两种:pending->fulfilled 或者 pending->rejected。
老猫-Leo
2023/12/11
2880
JavaScript Promise
JavaScript实现sleep方法
JavaScript是单线程语法,没有语言内置的休眠(sleep or wait)函数,所谓的sleep只是实现一种延迟执行的效果,无论是使用ES5,Promise,generator或者async await实现sleep,核心只是应用到了setTimeout方法。
伯爵
2019/10/17
11.3K0
JavaScript异步编程:Generator与Async
JavaScript异步编程:Generator与Async 从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱。 Promise是下边要讲的Generator/yield与async/await的基础,希望你已经提前了解了它。 在大概ES6的时代,推出了Generator/yield两个关键字,使用Generator可以很方便的帮助我们建立一个处理Promise的解释器。 然后,在
贾顺名
2018/06/14
1.1K0
javascript异步编程
简单来说,异步编程就是在执行一个指令之后不是马上得到结果,而是继续执行后面的指令,等到特定的事件触发后,才得到结果。
OECOM
2020/07/01
5690
async/await 源码实现
如果你有一个这样的场景,b依赖于a,c依赖于b,那么我们只能通过promise then的方式实现。这样的的可读性就会变得很差,而且不利于流程控制,比如我想在某个条件下只走到 b 就不往下执行 c 了,这种时候就变得不是很好控制!
用户4131414
2020/03/19
1.3K0
JavaScript 异步编程
JavaScrip 采用单线程模式工作的原因,需要进行DOM操作,如果多个线程同时修改DOM浏览器无法知道以哪个线程为主。
用户3045442
2020/07/31
1.2K0
JavaScript 异步编程
Promise/async/Generator实现原理解析
笔者刚接触async/await时,就被其暂停执行的特性吸引了,心想在没有原生API支持的情况下,await居然能挂起当前方法,实现暂停执行,我感到十分好奇。好奇心驱使我一层一层剥开有关JS异步编程的一切。阅读完本文,读者应该能够了解:
Nealyang
2020/03/25
1.9K0
JavaScript异步编程
#前言 从我们一开始学习JavaScript的时候就听到过一段话:JS是单线程的,天生异步,适合IO密集型,不适合CPU密集型。但是,多数JavaScript开发者从来没有认真思考过自己程序中的异步到底是怎么出现的,以及为什么会出现,也没有探索过处理异步的其他方法。到目前为止,还有很多人坚持认为回调函数就完全够用了。
leocoder
2018/10/31
1.1K0
js异步编程面试题你能答上来几道
在上一节中我们了解了常见的es6语法的一些知识点。这一章节我们将会学习异步编程这一块内容,鉴于异步编程是js中至关重要的内容,所以我们将会用三个章节来学习异步编程涉及到的重点和难点,同时这一块内容也是面试常考范围。
loveX001
2022/10/10
4990
面试官问 async、await 函数原理是在问什么?
这周看的是 co 的源码,我对 co 比较陌生,没有了解和使用过。因此在看源码之前,我希望能大概了解 co 是什么,解决了什么问题。
若川
2021/09/27
6540
Javascript之异步循环打印这道小题
  这道题,我相信很多前端从业者都知道,它本质上来说并不复杂,但是却可以有很深远的扩展,最终核心的主题其实就是异步的执行,其中对于题目的解法,还涉及到一些作用域的知识。那么我们以最简版的题目入手,逐步深入,一点点的剖开这道题所涉及到的知识概念和体系。
zaking
2022/09/28
1.9K0
Javascript之异步循环打印这道小题
JS--异步的日常用法
这两个名词确实是很多人都常会混淆的知识点。其实混淆的原因可能只是两个名词在中文上的相似,在英文上来说完全是不同的单词。
江拥羡橙
2023/12/09
3272
JS--异步的日常用法
Javascript异步回调细数:promise yield async/await
虽然我对js的鄙视一直都是无以复加,但是奈何前端环境不得不依赖javascript。哪些nodejs的大神们四处布道nodejs统治一切:单线程非阻塞,高IO操作。但是,java也可以做好吧,而且GO做的更干练!假设你的应用程序要做两件事情,分别是A和B。你发起请求A,等待响应,出错。发起请求B,等待响应,出错。Go语言的阻塞模型可以非常容易地处理这些异常,而换到了Node里,要处理异常就要跳到另一个函数里去,事情就会变得复杂。
周陆军博客
2023/05/07
8740
JavaScript中的async/await
async 是一个修饰符,async 定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数。
刘亦枫
2020/03/19
1.9K0
JavaScript异步编程:Promise、async&await与Generator
Promise 是 JavaScript 中用于处理异步操作的一种解决方案,它提供了一种更简洁、更清晰的方式来处理异步操作的结果。Promise 有三种状态:pending(进行中)、fulfilled(已完成,成功)和 rejected(已完成,失败)。Promise 的核心概念是链式调用,通过 .then() 方法处理成功(fulfilled)的结果,或者通过 .catch() 方法处理失败(rejected)的结果。
iwhao
2024/07/04
2851
【收藏】五种在循环中使用 async\u002Fawait 的方法
我们经常会遇到这样的需求,在循环中使用异步请求,而 ES6 的 async/await 是我们让异步编程更简单的利剑🗡。 本篇总结了 5 种在循环中使用 async/await 的方法(代码干货都能在浏览器控制台自测): 打勾的方法 ✔:表示在循环中每个异步请求是按照次序来执行的,我们简称为 “串行” 打叉的方法 ❌ :表示只借助循环执行所有异步请求,不保证次序,我们简称为 “并行” 按需所取,点赞👍收藏📕 forEach ❌ 首先,想到遍历,我们常用 forEach,用 forEach 可以吗?来试
掘金安东尼
2022/09/22
1.1K0
【收藏】五种在循环中使用 async\u002Fawait 的方法
async原理解析
把上面代码的Generator函数 foo 可以写成 async 函数,就是这样:
木子星兮
2020/07/16
6530
es6之深入理解promise对象
<font color=red>一、promise入门</font> 1. Promise对象是什么 回调函数的另一种原生实现,比之前回调函数的写法机构清晰,功能强大, 2.以前回调这么写 function a(fn){ let h = 1; setTimeout(function(){ if(h==1){ fn(h) }else{ throw Error('error!') } },10
连小壮
2018/08/21
2830
JavaScript执行(一):Promise里的代码为什么比setTimeout先执行?
首先我们考虑一下,如果我们是浏览器或者 Node 的开发者,我们该如何使用 JavaScript 引擎。
越陌度阡
2022/05/06
6200
JavaScript执行(一):Promise里的代码为什么比setTimeout先执行?
【JS】236-JS 异步编程六种方案(原创)
我们知道Javascript语言的执行环境是"单线程"。也就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务。
pingan8787
2019/07/25
9730
【JS】236-JS 异步编程六种方案(原创)
相关推荐
JavaScript Promise
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档