有没有比下面的pausecomp函数(取自此处)更好的方法来设计JavaScript中的睡眠?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
这不是JavaScript中的Sleep的重复-动作之间的延迟;我希望在函数的中间有一个真正的睡眠,而不是在代码执行之前有一段延迟。
有一个新的库Sequencr.js,它将函数与超时巧妙地链接在一起,这样就可以避免回调。
结果是:
setTimeout(function(timeout){
function1();
setTimeout(function(timeout){
function2();
setTimeout(function(timeout){
function3();
}, timeout, timeout)
}, timeout, timeout)
}, 10, 10);
在这方面:
Sequencr.chain([function1, function2, function3], 10);
并且内置支持在每次迭代之间“休眠”的循环。
如果你喜欢建议,不要失去表现。setTimeout是您的预期睡眠。然而,如果您需要一种语法,其中代码被睡眠“中间分割”,我们可以这样做:
sleep = function(tm, fn){
window.setTimeout(fn, tm);
}
然后,准备如下功能:
var fnBeforeSleep = function(){
// All code before sleep
}
var fnAfterSleep = function(){
// All code after sleep
}
然后:
fnBeforeSleep();
sleep(2000, fnAfterSleep);
// Yep! Syntactically, it is very close to:
fnBeforeSleep();
sleep(2000);
fnAfterSleep();
使用更好的DX实现更安全的异步睡眠
我使用睡眠进行调试。。。我忘了用wait太多次了。让我挠头。我在写下面的实时片段时忘记使用await。。。不再!
如果您在1毫秒内运行了两次,下面的睡眠功能会提醒您。如果您确定使用了await,它还支持传递一个相当的参数。它不会投掷,因此可以安全地用作睡眠的替代品。享受
是的,实时片段中有一个JavaScript版本。
// Sleep, with protection against accidentally forgetting to use await
export const sleep = (s: number, quiet?: boolean) => {
const sleepId = 'SLEEP_' + Date.now()
const G = globalThis as any
if (G[sleepId] === true && !quiet) {
console.error('Did you call sleep without await? use quiet to hide msg.')
} else {
G[sleepId] = true
}
return new Promise((resolve) => {
!quiet && setTimeout(() => {
delete G[sleepId]
}, 1)
setTimeout(resolve, (s * 1000) | 0)
})
}
//睡眠,防止意外忘记使用等待常量睡眠=(s,安静)=>{constsleepId='SLEEP_'+Date.now()const G=全局此if(G[sleepId]==true&&!quiet){console.error('您是否在没有等待的情况下调用sleep?使用quiet隐藏消息。')}其他{G[sleepId]=真}return new Promise((resolve)=>{!quiet&&setTimeout(()=>{删除G[sleepId]}, 1)setTimeout(解析,(s*1000)|0)})}常量main=async()=>{console.log('休眠1秒…')等待睡眠(1)console.log('使用等待的目标…')睡眠(99)睡眠(99)等待睡眠(1,true)console.log(“开发人员快乐!”)}main()
与公认更容易阅读的相比:
const sleep = (s: number) =>
new Promise((p) => setTimeout(p, (s * 1000) | 0))