什么是sleep()的JavaScript版本?

fms*_*msf 2115 javascript sleep

有没有sleep比使用以下pausecomp函数更好的方法来设计JavaScript (从这里开始)?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}
Run Code Online (Sandbox Code Playgroud)

这不是JavaScriptSleep的重复- 动作之间的延迟 ; 我希望在函数中间实现真正的睡眠,而不是在执行代码之前的延迟.

Dan*_*scu 2110

2017年更新

自从2009年提出这个问题以来,JavaScript已经有了很大的发展.所有其他答案现在已经过时或过于复杂.这是目前的最佳做法:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  for (let i = 0; i < 5; i++) {
    if (i === 3)
      await sleep(2000);
    console.log(i);
  }
}

demo();
Run Code Online (Sandbox Code Playgroud)

就是这个.await sleep(<duration>).

您可以在Runkit上试用此代码.注意,

  1. await只能在前缀为async关键字的函数中执行.Runkit在执行之前将代码包装在异步函数中.
  2. await仅暂停当前async功能

两个新的JavaScript功能帮助编写了这个实际的"睡眠"功能:

兼容性

如果由于某种原因,你正在使用节点超过7,或者针对旧的浏览器,async/ await仍然可以通过使用巴别塔(一种工具,将transpile的JavaScript +新功能集成到普通的旧的JavaScript),与transform-async-to-generator插件.跑

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  for (let i = 0; i < 5; i++) {
    if (i === 3)
      await sleep(2000);
    console.log(i);
  }
}

demo();
Run Code Online (Sandbox Code Playgroud)

创建await sleep(<duration>):

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  for (let i = 0; i < 5; i++) {
    if (i === 3)
      await sleep(2000);
    console.log(i);
  }
}

demo();
Run Code Online (Sandbox Code Playgroud)

然后运行你的代码

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  for (let i = 0; i < 5; i++) {
    if (i === 3)
      await sleep(2000);
    console.log(i);
  }
}

demo();
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用的是Node 7或更高版本,或者您的目标是现代浏览器,则不需要这样做.

  • 这不是"真正的睡眠",也没有回答这个问题.请问的人明确区分了http://stackoverflow.com/questions/758688/sleep-in-javascript和他的问题.在实际睡眠中,不能执行其他代码(除非在其他线程中).这个答案对另一个问题有好处. (63认同)
  • 目前的浏览器支持是什么?在绝大多数浏览器或至少所有常见浏览器都支持此解决方案之前,我不认为以前的解决方案是"过时的".相反,我认为这个解决方案很有意思,但在得到广泛支持之前无法使用/不切实际. (17认同)
  • @niry JavaScript是一种单线程语言,因此不适合“真正的”睡眠,因为它在与UI相同的线程上运行,并且会导致无响应的网页。 (7认同)
  • *从现在开始,新的承诺 `setTimeout()` 在 **node 16+** 中可用。`从'计时器/承诺'导入{setTimeout};等待 setTimeout(5000)` https://nodejs.medium.com/node-js-16-available-now-7f5099a97e70* (5认同)
  • 好东西在这里.我想知道,在JS调用"睡眠"模式后,这会如何影响或与现代浏览器"活动"/"非活动"状态相关?浏览器是否可以像普通JS那样阻止睡眠,以后在变为"活动"时调用,或者它具有不同的行为? (4认同)
  • @jacroe - 转换器处理箭头函数以及async/await(这会导致IE呕吐血液) (4认同)
  • “所有其他答案现在都已过时或过于复杂”,这确实是一个品味问题。一些开发人员会喜欢使用“.then”链接或回调,我认为这没有什么复杂的...... (3认同)
  • @AlvinThompson:大多数现代Web开发使用转换器,因此本机浏览器支持比清洁和更具前瞻性的代码更重要.无论如何,请参阅[caniuse](http://caniuse.com/#feat=async-functions). (2认同)
  • 虽然 Promise 可以被 polyfill,但箭头函数不能。对于那些必须支持 IE 的人来说,这不是一个可行的解决方案。 (2认同)
  • oneliner`等待新的Promise(r =&gt; setTimeout(()=&gt; r(),2000));` (2认同)
  • 函数声明的单行:`const sleep = ms =&gt; new Promise(resolve =&gt; setTimeout(resolve, ms))` (2认同)
  • @帕特里克·罗伯茨,我同意。但是,这是一个问题,“极其”显然。 (2认同)
  • 请注意,此_requires_要在异步函数中运行 (2认同)
  • @niry 抱歉几年后才来 ping,但我想你可能会感兴趣。重新阅读问题,确切的句子是“我想要在函数中间真正的睡眠”。如果函数是“异步”,那么这个答案是对问题的正确解释,因为它中断了函数的控制流(即使它不会暂停线程上的所有 JavaScript,正如您正确指出的那样)。您认为“真实”意味着暂停线程,而我认为这意味着他们只是想要可中断的控制流。 (2认同)

Ben*_*ynn 845

(参见2016年更新的答案)

我认为想要执行一个动作,等待,然后执行另一个动作是完全合理的.如果您习惯于使用多线程语言编写,那么在线程唤醒之前,您可能会在一段时间内执行执行操作.

这里的问题是JavaScript是一个基于事件的单线程模型.虽然在特定情况下,让整个引擎等待几秒钟可能会很好,但总的来说这是不好的做法.假设我想在编写自己的函数时使用你的函数?当我打电话给你的方法时,我的方法都会冻结.如果JavaScript可以某种方式保留你的函数的执行上下文,将它存储在某个地方,然后将其恢复并稍后继续,然后就可以发生睡眠,但这基本上就是线程化.

因此,您几乎坚持其他人的建议 - 您需要将代码分解为多个功能.

那么你的问题是一个错误的选择.没有办法以你想要的方式睡觉,你也不应该寻求你建议的解决方案.

  • 这根本不是一个正确的答案.如果Javascript没有睡眠功能,那只是因为ECMAScript不需要它.它是负责Javascript设计的机构的设计选择.在运行下一行代码之前,Javascript运行时可能会等待给定的时间,但是选择不这样做. (37认同)
  • 我同意为什么在JS中不能实现`sleep()`,而且大多数时候都有更好的方法来做事.但是我仍然会考虑发动机将所有事情联系起来的方式成为一个设计缺陷; 这种语言没有理由不能将"sleep()"函数限制在特定的脚本,页面或函数中,而不会让引擎破坏CPU并像疯子一样冻结应用程序.这是2015年,您不应该使用`while(1)`来破坏整个Web浏览器.我们有Flash这样的东西. (8认同)
  • 睡眠可以在JavaScript中完美实现,但不是实时精确.毕竟它是一个基于事件的系统.如果完成异步调用,则会触发事件.我发现没有理由为什么在发出sleep()之后不能这样做,之后控制被返回到浏览器,直到睡眠结束,将控制权返回给调用函数.是的,我也同意有时睡觉很方便,特别是当开发人员在你搞砸了设计这么糟糕以至于除了完全重构之外没有别的办法,你没有时间 (5认同)
  • 调用javascript单线程只是一个神话.虽然它在技术上可能是正确的,但在功能上它就像一个多线程语言.模拟fork()非常容易,虽然yield()实际上不是可实现的,但是通过使用共享内存来锁定/信号量可以非常接近.对于普通程序员来说,将其视为多线程是有意义的; 技术名称仅对该语言的开发人员有用. (4认同)

Nos*_*dna 634

在JavaScript中,我重写了每个函数,以便它可以尽快结束.您希望浏览器重新进入控制状态,以便进行DOM更改.

每次我想在我的功能中间睡一觉,我都会重构使用setTimeout().

我要编辑这个答案,因为我觉得这很有用:

在任何语言中臭名昭着的睡眠或延迟功能都备受争议.有些人会说应该总是有一个信号或回调来激发给定的功能,其他人会争辩说有时候任意延迟的时刻都是有用的.我说每个人都有自己和一个规则在这个行业中永远不会有任何规定.

编写一个sleep函数很简单,使用JavaScript Promises更加实用:

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// Usage!
sleep(500).then(() => {
    // Do something after the sleep!
});
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的答案. (380认同)
  • 通过关闭的方式.`function foobar(el){setTimeout(function(){foobar_cont(el);},5000); }` (188认同)
  • 好的,如果代码不打算在网页中使用该怎么办? (68认同)
  • @Nosredna是的,我们了解如何进行异步调用,这对我们没有帮助睡眠().我希望我的调用按特定顺序进行,并按照特定顺序恢复数据.我在for循环中有5级深度.我想BLOCK执行.一个真正的睡眠方法不会"减慢浏览器的速度",让睡眠控制回到浏览器以及任何其他需要CPU时间但仍在阻塞的线程. (31认同)
  • @EugenioMiró如果代码不打算在网页中使用,请让主机的对象模型实现sleep方法. - 我认为问题是面向暴露于网页上运行的javascript的DOM. (10认同)
  • @Tim loop-safe version:`for(i = 0; i <5; i ++){(function(i){setTimeout(function(){console.log(i);},1000*i);})(一世); }` (5认同)
  • 如何处理以下情况:1.在测试期间,开发人员想要模拟单击按钮调用需要很长时间的过程,并且要求不允许更改调用进程的方式或异步调用它.单击按钮,页面上会发生一些更改(如"请稍候......"消息,用户将根据服务器当前的繁忙程度随机查看,但现在开发人员希望直观地测试模拟该消息的消息服务器很忙. (4认同)
  • 真(同步)睡眠在测试中很有用,例如模拟长时间运行的JS任务.由于繁重的JS任务(例如,需要在非常大的页面上进行处理或非处理处理的大型有效负载的后端请求),会出现许多事件错误.在这种情况下,同步睡眠对于测试+ repro非常有用.应该永远不会在生产代码中运行,但远非无用. (3认同)
  • @EugenioMiró;我的错,我可能用错了词。您的问题与此处回答的问题无关,尝试通过在评论中提出问题来扩展范围是一个坏主意,您应该创建一个关于 node.js 或 w/e 服务器端 js 技术的新问题重新使用以获得真正的答案。 (2认同)
  • 我是唯一注意到睡眠功能与使用setTimeout(减去反向参数)相同的人吗? (2认同)
  • 如果我们想在for循环中使用它会怎么样? (2认同)
  • 正如你所说的那样,`setTimeout`在你的函数中间没有睡眠.您的功能继续执行.`setTimeout`中的所有其他内容将在稍后执行. (2认同)

小智 291

仅适用于debug/dev,如果它对某人有用,我会发布

有趣的东西,在Firebug(可能还有其他js控制台)中,只有在指定的睡眠时间后才会进入,

function sleepFor( sleepDuration ){
    var now = new Date().getTime();
    while(new Date().getTime() < now + sleepDuration){ /* do nothing */ } 
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

function sleepThenAct(){ sleepFor(2000); console.log("hello js sleep !"); }
Run Code Online (Sandbox Code Playgroud)

  • 这不是答案.它与问题中的代码完全相同,只是略短一些. (34认同)
  • @mafu这就是为什么它说`仅适用于debug/dev` ...*rolleyes* (29认同)
  • 忙着等待,真的吗?在JS?几秒钟?如果我抓住一个网站这样做,它将被阻止. (12认同)
  • 永远不要这样做.这将使CPU在其执行的核心上达到100%并将阻止它. (8认同)
  • 这在命令行javascript应用程序中很有用,也许是唯一的睡眠方式,因为async/await没有帮助. (3认同)
  • 这实际上解决了我的问题,因为这正是我所需要的:忙于调试目的。我不能使用await,不知道为什么,它不能编译。我不是js专家,所以我最好只使用这段代码,谢谢! (2认同)
  • 当您可以通过以下一行代码获得清晰的主线程阻塞时,为什么要为函数调用的“开销”而烦恼:`for (let e = Performance.now() + 2000; Performance.now() &lt; e; ) { }` (2认同)
  • 我赞成这个,因为,对于我的用例来说,实际上只是为了测试/开发,我真的想要一个*阻塞*睡眠/等待......这里评论“这不好”的人忽略了用例这很好 :-) (2认同)

Dev*_*inB 172

我同意其他海报,忙碌的睡眠只是一个坏主意.

但是,setTimeout不会阻止执行,它会在超时设置后立即执行函数的下一行,而不是在超时到期后执行,这样就无法完成睡眠完成的相同任务.

这样做的方法是将您的功能分解为部件之前和之后.

function doStuff()
{
  //do some things
  setTimeout(continueExecution, 10000) //wait ten seconds before continuing
}

function continueExecution()
{
   //finish doing things after the pause
}
Run Code Online (Sandbox Code Playgroud)

确保您的函数名称仍然准确地描述每个部分正在做什么(IE GatherInputThenWait和CheckInput,而不是funcPart1和funcPart2)

编辑

这种方法的目的是在超时之后不执行您决定的代码行,同时仍然将控制权返回给客户端PC以执行其排队的任何其他内容.

进一步编辑

正如评论中指出的那样,这绝对不会循环.你可以做一些花哨的(丑陋的)黑客攻击让它在一个循环中工作,但总的来说这只会造成灾难性的意大利面条代码.

  • 是啊.当你有一个循环或一个嵌套循环时,这变得棘手.你必须放弃你的for循环并改为使用计数器. (12认同)
  • @Nosredna不,你会使用一个闭包.例如:`function foo(index){setTimeout(function(){foo_continue(index);},10000); }和`for(var X = 0; X <3; X ++){foo(X); ` - _的_value_传递给`foo`,当最终调用`foo_continue`时,它会在名称`index`下重用. (6认同)
  • -1为此.同样,这不回答这个问题.这更像是"如何异步执行函数"这样的问题的答案,这与"如何阻止代码执行"非常不同. (2认同)
  • @Alexander当然可以,因为setTimeout()的目的是通过异步运行代码来阻止浏览器锁定.将`console.log()`放在setTimeout版本中的`foo_continue()`中,你得到相同的结果. (2认同)

cha*_*aos 125

为了爱$ DEITY,请不要做一个忙碌的等待睡眠功能. setTimeoutsetInterval做你需要的一切.

  • 我想我们很多人可能会忘记JavaScript不是一种仅限浏览器的语言.这个家伙可能正在创建一个Node命令行实用程序,需要短暂暂停,而无需处理setTimeout带来的所有变量范围问题. (33认同)
  • 除非您需要让睡眠同步,否则这是一个完全有效的问题. (10认同)
  • 我同意.真的"睡眠"不会冻结整个javascript引擎...... (9认同)
  • 不是很重要:setInterval对轮询的印象要好得多. (3认同)
  • 那段代码*不会在JavaScript引擎中阻止? (3认同)
  • @PhilLaNasa:如果句法闭包仍然吓到一个,那么一个人真的需要扣紧并通过节点101工作. (3认同)
  • @PhilLaNasa:闭包不是JS 101的任何上下文需要完整的课程重新设计,stat. (3认同)
  • @Aaron:由于Javascript只支持同步睡眠,因为在睡眠持续时间结束之前尽可能硬地敲击CPU,我对这种情况的唯一建议是"重新设计,直到你不再需要同步睡眠". (2认同)

mja*_*ard 113

我知道这是一个古老的问题,但如果(像我一样)你在使用Jino和Rhino,你可以使用...

try
{
  java.lang.Thread.sleep(timeInMilliseconds);
}
catch (e)
{
  /*
   * This will happen if the sleep is woken up - you might want to check
   * if enough time has passed and sleep again if not - depending on how
   * important the sleep time is to you.
   */
}
Run Code Online (Sandbox Code Playgroud)

  • 这是**Java**不是**Javascript** (13认同)
  • @RousseauAlexandre不正确.这是**JavaScript**使用Rhino(当时,它现在也可能是Nashorn) (12认同)
  • 这是对Java的调用吗? (3认同)

Ala*_*lum 68

如果您正在使用jQuery,有人实际上创建了一个"延迟"插件,它只不过是setTimeout的包装器:

// Delay Plugin for jQuery
// - http://www.evanbot.com
// - © 2008 Evan Byrne

jQuery.fn.delay = function(time,func){
    this.each(function(){
        setTimeout(func,time);
    });

    return this;
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以按预期在一行函数调用中使用它:

$('#warning')
.addClass('highlight')
.delay(1000)
.removeClass('highlight');
Run Code Online (Sandbox Code Playgroud)

  • 从jQuery 1.4开始,`.delay()`是jQuery的一部分(虽然语义与上面的实现不同).http://api.jquery.com/delay/ (38认同)
  • 这个问题绝对缺少的是[jQuery答案](http://4.bp.blogspot.com/-Hk1mt-RKYLc/UOkxShm6NrI/AAAAAAAACqo/LVmqHOfWV7g/s1600/20091116-so-large.gif)。很高兴我们得到了! (6认同)
  • 这不是一个糟糕的解决方案.保持上下文和可链接性. (4认同)

Mir*_*ili 54

从 Node.js 16+ 开始,新的 Promisified 版本setTimeout()可用

import { setTimeout as sleep } from 'timers/promises'

console.log('Hello!')

await sleep(2000) //  [2 seconds]

console.log('Goodbye, after 2 seconds!')
Run Code Online (Sandbox Code Playgroud)

您还可以传递一个value来实现承诺,也可以传递一个options(作为第二个和第三个参数)。请参阅https://nodejs.org/api/timers.html#timerspromisessettimeoutdelay-value-options

感谢@kigiri评论


小智 44

我也搜索过睡眠解决方案(不适用于生产代码,仅适用于开发/测试)并找到了这篇文章:

http://narayanraman.blogspot.com/2005/12/javascript-sleep-or-wait.html

...这里是客户端解决方案的另一个链接:http://www.devcheater.com/

此外,当您打电话时alert(),您的代码也将暂停,同时显示警报 - 需要找到一种不显示警报但获得相同效果的方法.:)

  • 我同意,很多人都说,"不,不要在生产代码中这样做!" 是的,嗯,我不想.我想在一次性测试代码中做到这一点,因此我不想花很多时间来制作一个优雅的解决方案. (35认同)

pgu*_*rio 30

这是使用同步XMLHttpRequest的简单解决方案:

function sleep(n){
  var request = new XMLHttpRequest();
  request.open('GET', '/sleep.php?n=' + n, false);  // `false` makes the request synchronous
  request.send(null);
}
Run Code Online (Sandbox Code Playgroud)

sleep.php的内容:

<?php sleep($_GET['n']);
Run Code Online (Sandbox Code Playgroud)

现在叫它:sleep(5);

  • 唯一的方法,但不幸的是,非异步XMLHttpRequests已被弃用,将来会被删除.这很有趣,因为这个事实首先导致了我这个问题. (11认同)
  • @lukad,如果可以的话,使用`setTimeout()`,但如果这样做意味着解开1000行回调,这可能开始看起来不像是一个笑话. (5认同)

Rav*_*yal 30

内联:

(async () => await new Promise(resolve => setTimeout(resolve, 500)))();
Run Code Online (Sandbox Code Playgroud)

这里的 500 是 VM 在移动到下一行代码之前等待的时间(以毫秒为单位)。

有点tldr;

基本上,当您创建承诺时,它会在创建时返回一个可观察的对象,并在回调中提供解析的引用,以便在数据/响应可用时移交数据/响应。在这里,resolve 在 500 毫秒后被调用setTimeOut,直到解析没有被执行,外部作用域才会等待进一步的处理,因此,创建了一个假阻塞。它与非阻塞(或在其他语言中称为非线程保留睡眠)完全不同,因为线程和很可能的 UI 以及网页/节点应用程序的任何其他正在进行的任务将被阻塞,并且主线程将被阻塞。专门用于等待承诺决议。


小智 29

干得好.正如代码所说,不要成为一个糟糕的开发者并在网站上使用它.这是一个开发实用功能.

// Basic sleep function based on ms.
// DO NOT USE ON PUBLIC FACING WEBSITES.
function sleep(ms) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + ms) {}
}
Run Code Online (Sandbox Code Playgroud)

  • 这与OP的基本相同. (16认同)
  • 更确切地说,这是OP要求替代的. (4认同)

Ake*_*ian 20

我个人喜欢简单:

function sleep(seconds){
    var waitUntil = new Date().getTime() + seconds*1000;
    while(new Date().getTime() < waitUntil) true;
}
Run Code Online (Sandbox Code Playgroud)

然后:

sleep(2); // Sleeps for 2 seconds
Run Code Online (Sandbox Code Playgroud)

我一直在使用它来创建伪造的加载时间,同时在P5js中创建脚本

  • @melMass 这个函数只是通过保持 CPU 100% 繁忙来阻塞 Node 线程 n 秒。由于这两个原因(阻塞+CPU杀手),这个“解决方案”是一个非常糟糕的主意。等待必须是非阻塞的,因此是异步的。 (4认同)
  • 我认为这是主要问题的最优化版本:它不在循环中做任何数学,只是一个简单的比较.读这篇文章有点困难. (3认同)
  • 从来没有这样做。在此功能运行时,您是否检查过CPU使用率?如果您有足够的时间进行操作,则应接近100%。 (2认同)
  • @hegez:鉴于循环无论如何都将在固定的墙上时钟时间内运行,似乎优化循环似乎不重要。 (2认同)

Ran*_*ner 20

setTimeout是 JavaScript 异步方法的一部分(开始执行的方法,其结果将在将来的某个时间排队到称为回调队列的组件中,稍后执行)

您可能想要做的是将setTimeout函数包装在 Promise 中。

承诺示例:

const sleep = time => new Promise(res => setTimeout(res, time, "done sleeping"));

// using native promises
sleep(2000).then(msg => console.log(msg));
Run Code Online (Sandbox Code Playgroud)

异步/等待示例:

const sleep = time => new Promise(res => setTimeout(res, time, "done sleeping"));

// using async/await in top level
(async function(){
  const msg = await sleep(2000);
  console.log(msg);
})();
Run Code Online (Sandbox Code Playgroud)

阅读有关setTimeout 的更多信息


Pab*_*dez 19

第一:

定义一个你想要执行的函数,如下所示:

function alertWorld(){
  alert("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

然后使用setTimeout方法安排执行:

setTimeout(alertWorld,1000)
Run Code Online (Sandbox Code Playgroud)

注意两件事

  • 第二个参数是以毫秒为单位的时间
  • 作为第一个参数,你必须只传递函数的名称(引用),而不是括号


nki*_*tku 19

使用Promise 的单行代码

const wait = t => new Promise(s => setTimeout(s, t, t));
Run Code Online (Sandbox Code Playgroud)

带有中止信号的打字稿

const wait = (x: number, signal?: AbortSignal): Promise<number> => {
  return new Promise((s, f) => {
    const id = setTimeout(s, x, x);
    signal?.addEventListener('abort', () => {
      clearTimeout(id);
      f('AbortError');
    });
  });
};

Run Code Online (Sandbox Code Playgroud)

演示

const wait = (x: number, signal?: AbortSignal): Promise<number> => {
  return new Promise((s, f) => {
    const id = setTimeout(s, x, x);
    signal?.addEventListener('abort', () => {
      clearTimeout(id);
      f('AbortError');
    });
  });
};

Run Code Online (Sandbox Code Playgroud)

  • 副本/面食是真实的 (4认同)

Mai*_*guy 16

让事情看起来像大多数人想要的更好的解决方案是使用匿名函数:

alert('start');
var a = 'foo';
//lots of code
setTimeout(function(){  //Beginning of code that should run AFTER the timeout
    alert(a);
    //lots more code
},5000);  // put the timeout here
Run Code Online (Sandbox Code Playgroud)

这可能是你最接近你想要的东西的东西.

请注意,如果您需要多次睡眠,这可能会匆忙变得难看,您可能实际上需要重新考虑您的设计.

  • 这首先是一个pouse而不是执行代码. (3认同)

小智 14

  await new Promise(resolve => setTimeout(resolve, 2000));
Run Code Online (Sandbox Code Playgroud)

确保您的调用函数是异步的

经过验证且工作正常


k06*_*06a 13

没有任何依赖的最短解决方案:

await new Promise(resolve => setTimeout(resolve, 5000));
Run Code Online (Sandbox Code Playgroud)

  • 这与 [Ahmed Mohammedali 的答案](/sf/ask/66571501/#56771739) 相同(首先发布)。 (3认同)
  • @PeterMortensen,它是从我在 2018 年 3 月给出的不同答案中复制的:/sf/answers/3439776511/ (2认同)

alf*_*sin 12

此答案适用于Node 18及更高版本!

而不是做:

await new Promise(resolve => setTimeout(resolve, 2000));
Run Code Online (Sandbox Code Playgroud)

我们现在可以这样做:

const { setTimeout } = require('timers/promises');
await setTimeout(3000); // sleep 3 seconds
Run Code Online (Sandbox Code Playgroud)


s.h*_*sam 11

2022 年更新

只需使用此代码片段即可。

await new Promise(resolve => setTimeout(resolve, 2000));
Run Code Online (Sandbox Code Playgroud)


Hom*_*er6 10

对于浏览器,我同意setTimeout和setInterval是要走的路.

但对于服务器端代码,它可能需要阻塞功能(例如,因此您可以有效地进行线程同步).

如果你正在使用node.js和meteor,你可能会遇到在光纤中使用setTimeout的限制.这是服务器端睡眠的代码.

var Fiber = require('fibers');

function sleep(ms) {
    var fiber = Fiber.current;
    setTimeout(function() {
        fiber.run();
    }, ms);
    Fiber.yield();
}

Fiber(function() {
    console.log('wait... ' + new Date);
    sleep(1000);
    console.log('ok... ' + new Date);
}).run();
console.log('back in main');
Run Code Online (Sandbox Code Playgroud)

请参阅:https://github.com/laverdet/node-fibers#sleep


Elo*_*Elo 10

我将setTimeOut封装在Promise中,以便与其他异步任务进行代码一致性:Fiddle中的 Demo

function sleep(ms)
{
    return(new Promise(function(resolve, reject) {        
        setTimeout(function() { resolve(); }, ms);        
    }));    
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

sleep(2000).then(function() { 
   // Do something
});
Run Code Online (Sandbox Code Playgroud)

如果您曾经使用过Promises,那么很容易记住语法.

  • 为什么这比使用setTimeout更好(function(){/*做某事*/},2000);? (4认同)

Gab*_*ner 9

这里的大多数答案都是误导的,或者至少是过时的.没有理由javascript必须是单线程的,事实上它不是.今天所有主流浏览器都支持工作者,在此之前,其他javascript运行时如Rhino和Node.js支持多线程.

'Javascript is single threaded'不是一个有效的答案.例如,在worker中运行sleep函数不会阻止在ui线程中运行的任何代码.

在支持生成器和yield的较新运行时,可以在单线程环境中为sleep函数带来类似的功能:

// This is based on the latest ES6 drafts.
// js 1.7+ (SpiderMonkey/Firefox 2+) syntax is slightly different

// run code you want to sleep here (ommit star if using js 1.7)
function* main(){
    for (var i = 0; i < 10; i++) {
        // to sleep for 10 milliseconds 10 times in a row
        yield 10;
    }

    yield 5;
    console.log('I just slept 5 milliseconds!');
}

// resume the given generator after ms milliseconds
function resume(ms, generator){
    setTimeout(function(){
        // ommit .value if using js 1.7
        var nextSleep = generator.next().value;
        resume(nextSleep, generator);
    }, ms);
}

// initialize generator and get first sleep for recursive function
var
    generator = main(),
    firstSleep = generator.next().value;

// initialize recursive resume function
resume(firstSleep, generator);
Run Code Online (Sandbox Code Playgroud)

这种模仿睡眠不同于真正的睡眠功能,因为它不会阻塞线程.它只是javascript的当前setTimeout函数之上的糖.此功能类型已在Task.js中实现,今天应该可以在Firefox中使用.


Arj*_*bra 9

我向以前的 python 开发人员推荐这种方法

const sleep = (time) => {
   return new Promise((resolve) => setTimeout(resolve, Math.ceil(time * 1000)));
};
Run Code Online (Sandbox Code Playgroud)

用法:

await sleep(10) // for 10 seconds
Run Code Online (Sandbox Code Playgroud)


use*_*408 8

我已经在javascript sleep/wait上搜索/搜索了不少网页...如果你想让javascript"运行,延迟,运行",那么没有答案...大多数人得到的是"RUN,RUN(无用)东西),运行"或"运行,运行+延迟运行"....

所以我吃了一些汉堡,并且开始思考::这里有一个解决方案可行......但是你必须砍掉你的运行代码... :::是的,我知道,这只是一个更容易阅读的重构...还是......

// ......................................... // example1:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setInterval
var i = 0;

function run() {
    //pieces of codes to run
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i >2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } //end interval, stops run
    i++; //segment of code finished running, next...
}

run();
t=setInterval("run()",1000);

</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

// .................................... // example2:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout
var i = 0;

function run() {
    //pieces of codes to run, can use switch statement
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(1000);}
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(2000);}
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(3000);}
    if (i==3){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>";} //stops automatically
    i++;
}

function sleep(dur) {t=setTimeout("run()",dur);} //starts flow control again after dur

run(); //starts
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

// ................. example3:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout
var i = 0;

function flow() {
    run(i);
    i++; //code segment finished running, increment i; can put elsewhere
    sleep(1000);
    if (i==5) {clearTimeout(t);} //stops flow, must be after sleep()
}

function run(segment) {
    //pieces of codes to run, can use switch statement
    if (segment==0){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==1){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
}

function sleep(dur) {t=setTimeout("flow()",dur);} //starts flow control again after dur

flow(); //starts flow
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

// .............. example4:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout, switch
var i = 0;

function flow() {
    switch(i)
    {
        case 0:
            run(i);
            sleep(1000);
            break;
        case 1:
            run(i);
            sleep(2000);
            break;
        case 5:
            run(i);
            clearTimeout(t); //stops flow
            break;
        default:
            run(i);
            sleep(3000);
            break;
    }
}

function run(segment) {
    //pieces of codes to run, can use switch statement
    if (segment==0){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==1){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    i++; //current segment of code finished running, next...
}

function sleep(dur) {t=setTimeout("flow()",dur);} //starts flow control again after dur

flow(); //starts flow control for first time...
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这适用于setTimeput,但很难看出发生了什么.使用setTimeout本身比这更容易. (5认同)

taw*_*ser 8

在 sleep 方法中,您可以返回任何 then-able 对象。而且不一定是新的承诺。

例子:

const sleep = (t) =>  ({ then: (r) => setTimeout(r, t) })

const someMethod = async () => {

    console.log("hi");
    await sleep(5000)
    console.log("bye");
}

someMethod()
Run Code Online (Sandbox Code Playgroud)


She*_*Ali 7

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个好的解决方案-在Selenium的JavaScriptExecutor中使用此功能,大约25%的时间将我的Chrome浏览器挂在2104 MacBook Pro上。 (2认同)

Kap*_*ook 7

使用Atomics.wait更新2019

应该在Node 9.3或更高版本中工作。

我在Node.js中需要一个非常准确的计时器,因此非常有用。但是,似乎浏览器中的支持非常有限。

let ms = 10000;
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
Run Code Online (Sandbox Code Playgroud)

运行了10秒的计时器基准测试。

使用setTimeout,我得到的错误最多为7000微秒。(7毫秒)

使用Atomics,我的错误似乎保持在600微秒以下。(0.6毫秒)

  • 是的,只要你意识到这是阻塞的,而且这通常不是一件好事 (2认同)

And*_*man 6

你不能像在JavaScript中那样睡觉,或者你不应该这样.运行sleep或while循环将导致用户的浏览器挂起,直到循环完成.

使用您引用的链接中指定的计时器.


acu*_*uth 6

您可能需要sleep()函数而不是使用setTimeout()的一种情况是,如果您有一个响应用户点击的函数,最终将打开一个新的弹出窗口,并且您已启动了一些需要短时间的处理在弹出窗口显示之前完成.将打开的窗口移动到闭包意味着它通常被浏览器阻止.


小智 6

如果你必须处理同步执行,我可以理解睡眠功能的目的.setInterval和setTimeout函数创建一个并行执行线程,该线程将执行序列返回给主程序,如果你必须等待给定的结果,这将无效.当然,可以使用事件和处理程序,但在某些情况下不是预期的.


cai*_*ci2 6

添加我的两位.我需要忙着等待测试.我不想分割代码,因为那将是很多工作,所以这对我来说很简单.

for (var i=0;i<1000000;i++){                    
     //waiting
  }
Run Code Online (Sandbox Code Playgroud)

我没有看到这样做的任何缺点,它为我做了诀窍.

  • @SteveMidgley"当你的代码占用JS线程时,没有其他的javascript [能够]运行"在我看来正是OP想要做的事情¯\ _(ツ)_ /¯ (5认同)
  • 我刚刚运行了一些测试,看起来即使是空循环也会阻塞浏览器和 CPU(不仅仅是 JavaScript)。并且使用 `for` 循环几乎总是会立即执行,无论 `i` 的最大值如何,即使其中放置了复杂的数学代码。所以除非你只是在等待几毫秒,否则在 JS 中似乎仍然没有办法优雅地睡觉。 (2认同)

小智 6

它可以使用Java的sleep方法完成.我已经在FF和IE中测试了它,它不会锁定计算机,咀嚼资源或导致无休止的服务器命中.对我来说似乎是一个干净的解决方案.

首先,您必须在页面上加载Java并使其方法可用.为此,我这样做了:

<html>
<head>

<script type="text/javascript">

  function load() {
    var appletRef = document.getElementById("app");
    window.java = appletRef.Packages.java;
  } // endfunction

</script>

<body onLoad="load()">

<embed id="app" code="java.applet.Applet" type="application/x-java-applet" MAYSCRIPT="true" width="0" height="0" />
Run Code Online (Sandbox Code Playgroud)

然后,当你想在JS中进行无痛停顿时,你所要做的就是:

java.lang.Thread.sleep(xxx)
Run Code Online (Sandbox Code Playgroud)

其中xxx是以毫秒为单位的时间.在我的情况下(通过证明),这是一个非常小的公司的后端订单履行的一部分,我需要打印一个必须从服务器加载的发票.我是通过将发票(作为网页)加载到iFrame然后打印iFrame来完成的.当然,我必须等到页面完全加载才能打印,所以JS必须暂停.我通过让发票页面(在iFrame中)使用onLoad事件更改父页面上的隐藏表单字段来实现此目的.打印发票的父页面上的代码看起来像这样(为了清晰起见,不相关的部分切割):

var isReady = eval('document.batchForm.ready');
isReady.value=0;

frames['rpc_frame'].location.href=url;

while (isReady.value==0) {
  java.lang.Thread.sleep(250);
} // endwhile

window.frames['rpc_frame'].focus();
window.frames['rpc_frame'].print();
Run Code Online (Sandbox Code Playgroud)

因此,用户按下按钮,脚本加载发票页面,然后等待,每四分之一秒检查发票页面是否完成加载,然后弹出打印对话框,供用户将其发送到打印机.QED.

  • 在考虑作者想要实现的简单事物时,似乎是非常可怕的. (12认同)
  • 这取决于不推荐使用的Java Applet. (2认同)

1j0*_*j01 6

很多答案都没有(直接)回答这个问题,而且这个问题也没有......

这是我的两分钱(或函数):

如果你想要比setTimeout和更少的笨重的函数setInterval,你可以将它们包装在只是颠倒参数顺序的函数中并给它们好名字:

function after(ms, fn){ setTimeout(fn, ms); }
function every(ms, fn){ setInterval(fn, ms); }
Run Code Online (Sandbox Code Playgroud)

CoffeeScript版本:

after = (ms, fn)-> setTimeout fn, ms
every = (ms, fn)-> setInterval fn, ms
Run Code Online (Sandbox Code Playgroud)

然后,您可以很好地使用它们与匿名函数:

after(1000, function(){
    console.log("it's been a second");
    after(1000, function(){
        console.log("it's been another second");
    });
});
Run Code Online (Sandbox Code Playgroud)

现在它很容易读作"经过N毫秒,......"(或"每N毫秒......")


Lud*_*fyn 6

你可以做这样的事情。一个所有函数都可以继承的sleep方法:

Function.prototype.sleep = function(delay, ...args) {
    setTimeout(() => this(...args), delay)
}

console.log.sleep(2000, 'Hello, World!!')
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止我最喜欢的 (2认同)

bea*_*ier 5

对于想要通过循环执行一组调用的特定情况,您可以使用类似下面的代码和原型.如果没有原型,可以使用setTimeout替换延迟函数.

function itemHandler(item)
{
    alert(item);
}

var itemSet = ['a','b','c'];

// Each call to itemHandler will execute
// 1 second apart
for(var i=0; i<itemSet.length; i++)
{
    var secondsUntilExecution = i;
    itemHandler.delay(secondsUntilExecution, item)
}
Run Code Online (Sandbox Code Playgroud)


tom*_*kwi 5

如果你在node.js上,你可以看一下光纤 - 节点的本地C扩展,一种多线程模拟.

它允许您以sleep阻止光纤执行的方式执行实际操作,但它在主线程和其他光纤中无阻塞.

这是他们自己的自述新鲜的一个例子:

// sleep.js

var Fiber = require('fibers');

function sleep(ms) {
    var fiber = Fiber.current;
    setTimeout(function() {
        fiber.run();
    }, ms);
    Fiber.yield();
}

Fiber(function() {
    console.log('wait... ' + new Date);
    sleep(1000);
    console.log('ok... ' + new Date);
}).run();
console.log('back in main');
Run Code Online (Sandbox Code Playgroud)

- 结果如下:

$ node sleep.js
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Run Code Online (Sandbox Code Playgroud)


小智 5

2009年的一个老问题.现在在2015年,ECMAscript 2015又名ES6中定义的发电机可以实现新的解决方案.它在六月份获得批准,但之前在Firefox和Chrome中实现过.现在,睡眠功能可以非繁忙,非阻塞并嵌套在循环和子功能中,而不会冻结浏览器.只需要纯JavaScript,没有库或框架.

下面的程序显示了如何sleep()以及如何runSleepyTask()制作.该sleep()功能只是一个yield声明.这很简单,实际上yield直接编写语句而不是调用更容易sleep(),但之后就没有睡眠字:-) yield会向next()内部方法返回一个时间值wakeup()并等待.实际的"睡眠"是在wakeup()使用旧的时候完成的setTimeout().在回调时,该next()方法触发yield语句继续,并且yield的"魔力"是所有局部变量及其周围的整个调用堆栈仍然完好无损.

必须将使用sleep()或yield的函数定义为生成器.通过在关键字中添加asterix轻松完成function*.执行生成器有点棘手.当使用关键字调用时,new生成器返回具有该next()方法的对象,但不执行生成器的主体(关键字new是可选的,没有区别).该next()方法触发生成器主体的执行,直到遇到a yield.包装函数runSleepyTask()启动乒乓:next()等待a yield,yield等待a next().

调用生成器的另一种方法是使用关键字yield*,这里它的工作方式类似于一个简单的函数调用,但它还包括返回的能力next().

这个例子都证明了这一点drawTree().它在旋转的3D场景上绘制了一棵树叶.树木被绘制为树干,顶部有3个不同方向的树.然后通过drawTree()在短暂睡眠之后递归调用,将每个部分绘制为另一个但更小的树.一棵非常小的树被画成一片叶子.

每个叶子都有自己的生命,在一个单独的任务开始runSleepyTask().它诞生,成长,坐下,褪色,跌倒和死亡growLeaf().速度由控制sleep().这表明了如何轻松完成多任务处理.

function* sleep(milliseconds) {yield milliseconds};

function runSleepyTask(task) {
    (function wakeup() {
        var result = task.next();
        if (!result.done) setTimeout(wakeup, result.value);
    })()
}
//////////////// written by Ole Middelboe  /////////////////////////////

pen3D =setup3D();
var taskObject = new drawTree(pen3D.center, 5);
runSleepyTask(taskObject);

function* drawTree(root3D, size) {
    if (size < 2) runSleepyTask(new growLeaf(root3D))
    else {
        pen3D.drawTrunk(root3D, size);
        for (var p of [1, 3, 5]) {
            var part3D = new pen3D.Thing;
            root3D.add(part3D);
            part3D.move(size).turn(p).tilt(1-p/20);
            yield* sleep(50);
            yield* drawTree(part3D, (0.7+p/40)*size);
        }
    }
}

function* growLeaf(stem3D) {
    var leaf3D = pen3D.drawLeaf(stem3D);
    for (var s=0;s++<15;) {yield* sleep(100); leaf3D.scale.multiplyScalar(1.1)}
    yield* sleep( 1000 + 9000*Math.random() );
    for (var c=0;c++<30;) {yield* sleep(200); leaf3D.skin.color.setRGB(c/30, 1-c/40, 0)}
    for (var m=0;m++<90;) {yield* sleep( 50); leaf3D.turn(0.4).tilt(0.3).move(2)}
    leaf3D.visible = false;
}
///////////////////////////////////////////////////////////////////////

function setup3D() {
    var scene, camera, renderer, diretionalLight, pen3D;

    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(75, 
        window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.set(0, 15, 20);
    renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    
    directionalLight = new THREE.DirectionalLight(0xffffaa, 0.7);
    directionalLight.position.set(-1, 2, 1);
    scene.add(directionalLight);
    scene.add(new THREE.AmbientLight(0x9999ff));
      
    (function render() {
        requestAnimationFrame(render);
        // renderer.setSize( window.innerWidth, window.innerHeight );
        scene.rotateY(10/60/60);
        renderer.render(scene, camera);
    })();
    
    window.addEventListener(
        'resize',
        function(){
            renderer.setSize( window.innerWidth, window.innerHeight );
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
       }, 
       false
    );
    
    pen3D = {
        drawTrunk: function(root, size) {
            // root.skin = skin(0.5, 0.3, 0.2);
            root.add(new THREE.Mesh(new THREE.CylinderGeometry(size/12, size/10, size, 16), 
                root.skin).translateY(size/2));
            root.add(new THREE.Mesh(new THREE.SphereGeometry(size/12, 16), 
                root.skin).translateY(size));
            return root;
        },
        
        drawLeaf: function(stem) {
            stem.skin.color.setRGB(0, 1, 0);
            stem.add(new THREE.Mesh(new THREE.CylinderGeometry(0, 0.02, 0.6), 
                stem.skin) .rotateX(0.3).translateY(0.3));
            stem.add(new THREE.Mesh(new THREE.CircleGeometry(0.2), 
                stem.skin) .rotateX(0.3).translateY(0.4));
            return stem;
        },
        
        Thing: function() {
            THREE.Object3D.call(this);
            this.skin = new THREE.MeshLambertMaterial({
                color: new THREE.Color(0.5, 0.3, 0.2),
                vertexColors: THREE.FaceColors,
                side: THREE.DoubleSide
            })
        }
    };

    pen3D.Thing.prototype = Object.create(THREE.Object3D.prototype);
    pen3D.Thing.prototype.tilt = pen3D.Thing.prototype.rotateX;
    pen3D.Thing.prototype.turn = pen3D.Thing.prototype.rotateY;
    pen3D.Thing.prototype.move = pen3D.Thing.prototype.translateY;
    
    pen3D.center = new pen3D.Thing;
    scene.add(pen3D.center);
    
    return pen3D;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r71/three.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

3D内容隐藏在setup3D()中,仅包含它以使其比console.log()更无聊.顺便说一下,天使用弧度来衡量.

经测试可在Firefox和Chrome中使用.未在Internet Explore和iOS(iPad)中实现.尝试自己运行它.

在我找到答案后,Gabriel Ratener在一年前提出了类似的答案:https://stackoverflow.com/a/24401317/5032384


Har*_*rry 5

从Node 7.6开始,您可以将promisifyutils模块中的功能与结合 使用setTimeout

const sleep = require('util').promisify(setTimeout)
Run Code Online (Sandbox Code Playgroud)

一般用法

async function main() {
    console.time("Slept for")
    await sleep(3000)
    console.timeEnd("Slept for")
}

main()
Run Code Online (Sandbox Code Playgroud)

问题用法

async function asyncGenerator() {
    while (goOn) {
      var fileList = await listFiles(nextPageToken);
      await sleep(3000)
      var parents = await requestParents(fileList);
    }
  }
Run Code Online (Sandbox Code Playgroud)