javascript - 暂停/恢复在 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
}
在此期间,在客户端,如果玩家点击上电,它会将事件通知服务器,服务器将停止上述超时并做其他事情
解决方案
我对此的解决方案是创建一个管理 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>
推荐阅读
- javascript - 防止子元素在子菜单项单击时触发父事件
- terraform - 那么 terraform 版本控制方案呢?
- wpf - 有没有办法在 WPF Core 中使用文件夹选择器(FolderBrowserDialog)?
- c# - 如何在网格视图中使用 ObjectDataSource?
- rubymotion - RubyMotion 新项目给出错误 dlopen(/Applications/Xcode.app/Contents/Developer/../Frameworks/libswiftCore.dylib, 2): image not found
- database - Esqueleto 只返回一列
- https - 如何将我的 Google 域与我的 Google Cloud DNS 关联?
- unit-testing - AutoMapper 的 AssertConfigurationIsValid 和 EF 导航属性
- python - 如何在熊猫中使用就地保存修改?
- firebase - React Native Firebase Android 总是崩溃 0.61