gpt4 book ai didi

javascript - 在 JavaScript 中等待不仅仅是将所有内容包装在 setTimeout 中

转载 作者:行者123 更新时间:2023-12-01 02:10:58 25 4
gpt4 key购买 nike

所以,我正在创建一个机器人来在线玩视频游戏(完全合法,有一个用于机器人比赛的服务器,不用担心)。代码是用 JavaScript 编写的,我现在刚刚开始学习,但我无法告诉机器人做某事,然后按时间或按条件等待,直到做其他事情。

到目前为止,我只是将所有内容包装在巨大的 setTimeout 命令中,但这非常不优雅。

与帖子相关的代码并不多,但本质上我已经编写了很多代码,这些代码执行诸如移动到特定位置、刹车、追逐另一个玩家等操作。大多数代码都使用递归 setTimeout 命令 -按某些按钮,重置变量,然后如果不满足条件则再次启动该功能。如果我想移动到特定位置,然后在完成后刹车,通常我会输入如下代码:

moveTarget(target);
brake();
[...Execute rest of code...]

但是,JavaScript 同时执行这两个命令,这显然效果不太好。有没有一种方法可以使事情更像这样(或者具有条件而不是指定时间的等效内容):

moveTarget(target);
wait3Seconds();
brake();
[...Execute rest of code...]

无需这样做:

moveTarget(target);
setTimeout(function(){
brake();
[...Execute rest of code...]
},3000);

考虑到我将遇到很多这样的情况,我的代码最终看起来就像是嵌套 setTimeouts 的巨大困惑,这不是很漂亮。有没有更好的办法?我已经在使用 JQuery,因此如果有必要我非常愿意使用它。

最佳答案

一些背景...

JavaScript 处理并发的方式与您可能习惯的其他编程语言不同。相反,JavaScript 只有一个主线程,并且有一个队列,用于注册然后按事件发生的顺序处理事件。

因此,不要执行会长时间阻塞线程的操作(例如 Thread.sleep() 等函数会执行的操作),这一点非常重要。这就是为什么您应该使用 setTimeout 或 setInterval 来做这样的事情。

您始终可以创建自定义 sleep 函数来按照您请求的样式编写代码。这可能是这样的:

function sleep(millis) {
var startTime = Date.now();
while (Date.now() < startTime + millis) {}
}

但这将非常非常糟糕。当这个 sleep 函数运行时,这会卡住页面。

回到你的问题...

您基本上需要重构您的代码以使其更加“多事”。您应该编写 JavaScript 代码来使用回调和超时,而不是在同一 block 中使用大量线性代码。

因此,您展示的最后一个代码块实际上是您应该遵循 JavaScript 的范例:

moveTarget(target);
setTimeout(function(){
brake();
[...Execute rest of code...]
},3000);

但是,如果您不是[...执行其余代码...],而是将其拆分为其他函数并从您的内部调用它们,那么您当然可以清理很多东西setTimeout 回调。当然,在任何编程语言中,保持代码块小而简洁都是一个很好的经验法则。

<小时/>

您可能还有兴趣查看 request animation frame function .

关于javascript - 在 JavaScript 中等待不仅仅是将所有内容包装在 setTimeout 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22924196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com