【问题标题】:Pausing/resuming code executing in nodejs暂停/恢复在 nodejs 中执行的代码
【发布时间】:2019-10-31 12:20:56
【问题描述】:

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

目前我正在使用,

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

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

简而言之,我想做的是:

服务器端代码

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

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

【问题讨论】:

  • 您在这里没有提供太多代码上下文来提供非常具体的建议,但是如果单击加电,您可以让代码的另一部分更早(在超时触发之前)解决承诺。跨度>
  • 那么我可以将以上承诺存储在一个变量中吗?我如何从其他地方解决承诺?我也编辑了描述,你能帮我看看吗?
  • 您没有显示此代码是如何收到通知已单击通电的。这决定了您可能有哪些选择。一般来说,不需要在承诺执行器之外解决承诺,但您可以使用延迟对象设计模式来完成,您可以在此处看到:stackoverflow.com/questions/37651780/…

标签: javascript node.js timer


【解决方案1】:

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

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

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

添加一个函数cancel(),它简单地解析promise实例并清除超时。

<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>

【讨论】:

  • 干杯!有效。你能给我推荐一些网站/视频,让我可以了解更多这些东西吗?
  • @Ashok 你已经知道PromisesetTimeout,现在你刚刚看到我使用clearTimeoutJavaScript class。这些是 4 个东西放在一起来实现你想要的。不知道有没有网站教这个。只需查看他们的文档,您就会通过一遍又一遍地使用它们来学习它们,您将获得理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2014-05-29
  • 2015-10-19
  • 2021-08-06
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多