假设我有 20 行 JS 代码,我希望解释器只执行一半代码(<11 行),然后停止,没有函数和返回,或者没有注释其余代码(我已经尝试过返回,提前查看)。
第 10 行中的 location.reload(true);
是一个接近的解决方案,但我正在寻找客户端停止。
我的问题
在 JavaScript 中是否有类似 stop
命令(或功能),它要求解释器停止并表现得好像到目前为止没有代码运行一样?
我为什么要问
这个问题的背景是我在多个 keydown
事件中调用一个函数的问题。
鉴于 keydown
事件只触发一次,我考虑在 keydown
事件被一次性触发后将解释器发送回开始,而不刷新页面(抱歉如果这看起来很荒谬,我是 JS 的新手并且没有找到错误的来源)。
当然,上面的问题不同于我已经在这里问过的问题“为什么 keydown 事件只触发一次”- here's a link for context .
防止 XY 问题
一方面,我想确保没有 XY 问题。另一方面,我不允许将上一个问题复制到本次 session ,因此链接到上面。
无论哪种方式,我很高兴知道我刚才描述的(JS 解释器的客户端停止)在当前版本的语言中是否可行。
注意:在今天早些时候发表一些评论(没有答案)后,我决定仔细重写这个问题,并尽最大努力确保这个问题提供信息和公共(public)性。
最佳答案
没有停止命令,但我之前有一个长时间运行的客户端操作时需要它。
解决方法:
1) 将问题分成小的数据包
2) 确保您能够使您的函数
仅在activeMilliseconds
毫秒内工作:
function doStuff(packets, currentIndex, activeMilliseconds) {
var start = new Date(); //Start of chunk
while((currentIndex < packets.length) && (new Date() - start < activeMilliseconds)) {
//Do something with packets[currentIndex]
currentIndex++;
}
return currentIndex;
}
3) 现在我们可以工作 activeMilliseconds
毫秒,我们需要异步使用它:
//Define packets
var currentIndex = 0;
var intervalID = setTimeout(function() {
If(currentIndex = doStuff(packets, currentIndex, activeMilliseconds) >= packets.length) clearInterval(intervalID);
}, totalMilliseconds);
节点:totalMilliseconds > activeMilliseconds 应该为真。例如,如果 totalMilliseconds
是 250,而 activeMilliseconds
是 200,那么在每 250 毫秒内,一个 block 将运行 200 毫秒,让浏览器执行它的工作 50 毫秒每 250 毫秒一次,即使有很多工作要做。
4) 确保作业停止之前的类似作业:
function doJob(packets, intervalID, activeMilliseconds, totalMilliseconds) {
clearInterval(intervalID);
//Define packets
var currentIndex = 0;
var intervalID = setTimeout(function() {
If(currentIndex = doStuff(packets, currentIndex, activeMilliseconds) >= packets.length) clearInterval(intervalID);
return intervalID;
}, totalMilliseconds);
}
如果你将这个想法用于你的按键事件,那么它将停止之前的键盘,你这样做的最长等待时间将是 activeMilliseconds,在我看来这是一个可以接受的折衷方案。
也就是说,只有在您别无选择的情况下才应使用此方法。您需要知道 Javascript 具有单线程,因此即使您在事件的前一个实例仍在运行时触发了函数执行,您的新事件也会在另一个事件完成后按顺序执行。
关于javascript - 将 JavaScript 解释器发送回代码顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46042185/