Javascript 如何暂停整个脚本,然后继续脚本

Javascript 如何暂停整个脚本,然后继续脚本,javascript,Javascript,我有很多脚本,它们调用了几千次setTimeout()函数,基本上在画布上绘制动画线条。当然,它可以在计算机上运行,如果用户不触摸任何东西,它也可以在移动设备上运行。在这种情况下,我添加了一个touchstart事件监听器,当触摸任何东西时,它将启动整个动画(它们都大约30到40秒长)。又一次很好地工作了。问题是,几乎每个人都有移动设备屏幕变暗,然后在动画完成之前关闭,当然,当您看到屏幕变暗时,您触摸屏幕以防止其关闭,因此动画重新开始 我已经玩弄了clearTimeout()函数,我能做的最好的

我有很多脚本,它们调用了几千次setTimeout()函数,基本上在画布上绘制动画线条。当然,它可以在计算机上运行,如果用户不触摸任何东西,它也可以在移动设备上运行。在这种情况下,我添加了一个touchstart事件监听器,当触摸任何东西时,它将启动整个动画(它们都大约30到40秒长)。又一次很好地工作了。问题是,几乎每个人都有移动设备屏幕变暗,然后在动画完成之前关闭,当然,当您看到屏幕变暗时,您触摸屏幕以防止其关闭,因此动画重新开始

我已经玩弄了clearTimeout()函数,我能做的最好的事情就是一次清除对它的所有调用,然后重新开始。这就是我所注意到的,我有时会在代码中抛出一个警报(无论什么)来调试它,我注意到当移动设备上弹出一个框时,它实际上会暂停整个javascript,包括所有数千个setTimeout调用,然后当你在警报框上按ok时,剧本从它停下来的地方继续快乐地进行着。这就是我想要的

问题是,是否有全局脚本暂停功能可以模拟一个警报框,该警报框将在触摸时暂停整个脚本(允许用户说滚动页面或填写文本框或其他内容),然后从停止的位置继续

只是在这里添加了一个抱怨:为什么在移动设备上滚动页面、缩放或简单单击一个显示键盘的文本框会影响setTimeout()函数的计时,它从一开始就被加载到内存中,时间是绝对的,它一直在运行,毫无意义


谢谢你的阅读。

令人困惑的人,有很多东西要读。我仍然感到困惑,我认为你需要一些东西,不断地检查它是否需要抛出警报,或者你是否抛出警报。暂停某事直到警报消失

您将使用一个循环函数,该函数仅在alert=false或sleep=false时运行

var sleep = false;

function main() {
     if (!sleep) {

        // We run the script
        // Throw alert
        // Sleep now = true, because we threw alert
       sleep = true;

    } else if (sleep == true) {
        // Pause
        // Re-run when sleep is not false;
        main();
    } else {
 //whatevs
}

当/如果屏幕进入睡眠状态,“全局暂停”将在所有浏览器(除Firefox外)上自动发生。(我认为Firefox的行为是一个bug,是一种永久性的唤醒锁)

您可以检测可见性是否已随以下内容而更改:-

    document.addEventListener("visibilitychange", visibilityChange);

这对初始dim没有帮助,但我建议您只需触摸事件,在返回开始并重新初始化之前请求重新启动确认。

您是说
setTimeout()
在代码中出现数千次?如果是这样,我会重新构造它,将关于每个步骤的所有信息放在一个数组中,然后使用一个知道如何从数组中绘制下一个内容的函数,并使用
setTimeout()
调用自身来执行下一步。如果要暂停整个过程,您只需担心一个函数。不,setTimeout有两个循环,首先是为要绘制的每一整条直线、圆弧或圆设置一个循环,然后将每个循环传递给另一个setTimeout循环,该循环一次绘制上述直线、圆弧或圆的每个像素。画布是800x800,平均线路长度是400,实际线路大约有100条,这就是4000个SetTimeout调用,这也是一个很小的调用。时间都是从一开始就计算出来的,并放入一个数组中,我很震惊它工作得如此之好。@JohnH checkout的官方答案我想你需要的是这个答案中的睡眠函数脚本,它利用了Promise功能。。你试图解决问题的错误部分。真正的问题是,当用户滚动时,您的代码无法正常工作。这很可能是由于性能问题,而性能问题本身可能是由于编码问题。如果看不到您的代码和密码,我们就不可能正确地帮助您。但是,从你所说的,你已经得到了如何做一个视觉动画部分完全错误。不要使用多个
setTimeout
,而是使用单个
requestAnimationFrame
循环。这个基本错误只告诉我们可能还有什么其他错误…哦,谢谢你,我从来没有在任何研究中见过requestanimationframe循环,这是很多,当我开始编写这个时,难以置信。我不知道如何建立链接,但这是一个简单明了的解决方案。
==
=
,而不是
=
在您的
条件下的
=
。但是你可以说,
if(!sleep){…}else{…}
。是的,很晚了。你只是用那些无限循环冻结了浏览器。经过一定数量的循环后,它将发出抱怨。
    document.addEventListener("visibilitychange", visibilityChange);