首页 > 解决方案 > 暂停/恢复在 nodejs 中执行的代码

问题描述

所以我正在制作某种游戏,其中玩家有一些通电。玩家回合结束后,服务器应该有 5 秒的超时,这里没有执行任何代码,然后应该在时间过后通过回合。但是,如果客户端单击其中一个电源,服务器应停止 5 秒超时并重新开始执行。我该如何实施?

目前我正在使用,

await new Promise(r => setTimeout(r, 5000))

它停止并等待超时结束,但是当客户端选择加电时如何停止超时?我们如何清除基于 Promise 的超时?

简而言之,我想做的是:

服务器端代码

function doSomething(){
     if(playerHasPowerUps) await new Promise(r => setTimeout(r, 5000))
     //do other things
}

在此期间,在客户端,如果玩家点击上电,它会将事件通知服务器,服务器将停止上述超时并做其他事情

标签: javascriptnode.jstimer

解决方案


我对此的解决方案是创建一个管理 Promise 和 Timeout 实例的类。

让我们命名这个类Sleep,它在其构造函数中使用持续时间,并在给定的持续时间内安排超时,并创建一个 Promise 实例。

添加一个wait()返回 promise 实例的异步函数,以便我们可以await继续。

添加一个cancel()简单地解决承诺实例并清除超时的函数。

<html>
	<body>
		<button onClick="cancelWait()">Cancel wait</button>
		<div id="text"></div>
	</body>

	<script lang="javascript">

		class Sleep {
		   constructor(duration) {
			  this.promise = new Promise((resolve) => {
				this.promiseResolve = resolve
				this.timeout = setTimeout(() => {
				  resolve()
				}, duration)
			  })
		   }
		   
		   async wait() {
			  return await this.promise
		   }
		   
		   cancel() {
			  clearTimeout(this.timeout)
			  this.promiseResolve()
		   }
		}

		//Usage
		let sleep
		
		const main = async () => {
			const text = document.getElementById("text")
			text.innerText = 'start'			
						
			sleep = new Sleep(3000)
			await sleep.wait()	

			text.innerText = 'finish'
		}
		
		const cancelWait = () => {
			sleep.cancel()
		}
		
		main()

	</script>

</html>


推荐阅读