你好。我需要实现以下逻辑:
第一阶段:用户在服务器上做某事 - 40 秒
第二阶段:进程正在运行 - 随机秒数(从 3 到 10)
第三阶段:冷却 - 用户欣赏结果 - 2 秒
一切都从头到尾重复
setInterval 不合适,因为它以 EQUAL 间隔重复代码,并且我的代码的结束时间仅在此过程中才知道。如果您使用带余量的间隔时间,则第三阶段将执行 2 秒或 15 秒 - 不可接受。
像这样的解决方案(递归)
function round() {
var delay = 20000 * Math.random(); //узнаем, через сколько в этот раз должен сработать код
setTimeout(function () {
console.log('Hellow world!');//что-то тут делаю
round(); //и перезапускаю
}, delay);
}
round();
不行,因为每次新的递归,临时变量会累积,内存会被堵塞,一直重启服务器是不行的
显然毕竟应该有一个美丽而正确的决定?在这种情况下使用什么?有必要这样做,以便有某种异步函数,如下所示:
- 报告第 1 阶段的开始(使用 socket.io)
- 等待 40 秒
- 报告第 2 阶段的开始
- 等待随机秒数
- 报告第 3 阶段的开始
- 等待 2 秒
那么函数应该重新开始,但不是递归。而且我想在不相互嵌套的情况下设置超时。而且不像“战争与和平”的代码。
嵌套的 setTimeouts 不会阻塞堆栈,因为它们是异步执行的,所以不必害怕它们。
为了解决您的情况,您需要自己编写某种计时微库,允许您创建具有超时的事件链。这有点像 fetch 中的 promise。
这段代码看起来像这样
实现将基于 setTimeout。但是它看起来会很好,因为它被封装在这个函数中,并且由于它的异步性,它不会阻塞堆栈。因为每个函数都调用自己的 setTimeout 并结束自己。
在这里,在示例中,暂停是在链中显式设置的,但您可以简单地返回其值,例如,从 lambda 本身。
作为一种选择,编写一个 js 函数,该函数将在最后调用自身
setTimeout