javascript - 将 JavaScript 解释器发送回代码顶部

标签 javascript dom-events keydown

假设我有 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/

相关文章:

cocoa - theEvent charactersIgnoringModifiers - 获取不带修饰符的字符

javascript - 如何使用 Jquery FileUpload 库完全删除任何类型的缩略图?

javascript - HTML输入范围的值,getattribute vs value

javascript - 向 Safari 中 undefined object 原型(prototype)新添加的函数/属性

javascript - 我应该监听哪些事件以在 JavaScript 中隐藏自定义上下文菜单

asp.net - 检测到F5被按下并刷新

javascript - 如何在 react 中正确创建 cmd+K 键盘快捷键?

javascript - 使用 HighCharts 热图的 BorderRadius

javascript - 有没有办法仅在事件持续一段时间后才触发函数

javascript - 我应该在我的 Javascript 游戏引擎中使用 DOM 片段作为 Shadow dom 吗?