JavaScript中的Sleep - 操作之间的延迟

163

在 JavaScript 中,是否有办法在执行另一个操作之前进行睡眠操作?

例子:

var a = 1 + 3;
// Sleep 3 seconds before the next action here.
var b = a + 4;
15个回答

1

我知道这个问题很老了,但如果有人正在搜索, 使用Promise在JavaScript中实际休眠的方法更加简洁。

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

const run = async () => {
    while(true){
        console.log("yay1")
        await sleep(3000)
        console.log("next action")
    }
}

run()

这将始终在第一次日志和第二次日志之间有3秒的暂停

这里发生的是,

  1. 使用await,JavaScript代码执行会暂停,直到promise被解决。

  2. 当触发resolver时,promise将被解决。当setTimeout被执行时,resolver将被触发。

  3. setTimeout将在给定的毫秒数后执行。


1

就它的价值而言

  isPause = true;
  setTimeout(()=>{isPause=false},2000);
  while (!isPause) {
    // delay for 2 seconds
  }
    

1
你可以使用 setTimeout 在指定的时间后调用回调函数:
setTimeout(() => {
    console.log('Called after 1 second');
}, 1000);

如果您想将setTimeout作为一个Promise使用,可以这样做:
const delay = milliseconds => new Promise(resolve => { setTimeout(resolve, milliseconds); });

await delay(1000);

console.log('Called after 1 second');

自 Node.js 16 开始,这个功能也是 内置的

import {setTimeout as delay} from 'node:timers/promises';

await delay(1000);

console.log('Called after 1 second');

如果你想在 Node.js 或浏览器中实现同步延迟 在主线程之外你可以使用Atomics.wait

const delay = milliseconds => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);

await delay(1000);

console.log('Called after 1 second');

我喜欢这种优雅简洁的风格。而且只有一行代码,令人印象深刻。我送你一杯你喜欢的虚拟啤酒。 - B-Money

0

这是我的模型,展示了如何使用生成器函数(ES6)在JavaScript中“睡眠”或“DoEvents”。 代码已经注释:

<html>
<head>
<script>
  "use strict"; // always
  // Based on post by www-0av-Com https://stackoverflow.com/questions/3143928
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
  var divelt, time0, globaln = 0; // global variables
  var MainGenObj = Main(); // generator object = generator function()
window.onload = function() {
  divelt = document.getElementsByTagName("body")[0]; // for addline()
  addline("typeof Main: " + typeof Main);
  addline("typeof MainDriver: " + typeof MainDriver);
  addline("typeof MainGenObj: " + typeof MainGenObj);
  time0 = new Date().valueOf(); // starting time ms
  MainDriver(); // do all parts of Main()
}
function* Main() { // this is "Main" -- generator function -- code goes here
  // could be loops, or inline, like this:

  addline("Part A, time: " + time() + ", " + ++globaln); // part A
  yield 2000;                    // yield for 2000 ms (like sleep)

  addline("Part B, time: " + time() + ", " +  ++globaln); // part B
  yield 3000;                    // yield for 3000 ms (or like DoEvents)

  addline("Part Z, time: " + time() + ", " +  ++globaln); // part Z (last part)
  addline("End, time: " + time());
}
function MainDriver() { // this does all parts, with delays
  var obj = MainGenObj.next(); // executes the next (or first) part of Main()
  if (obj.done == false) { // if "yield"ed, this will be false
    setTimeout(MainDriver, obj.value); // repeat after delay
  }
}
function time() { // seconds from time0 to 3 decimal places
  var ret = ((new Date().valueOf() - time0)/1000).toString();
  if (ret.indexOf(".") == -1) ret += ".000";
  while (ret.indexOf(".") >= ret.length-3) ret += "0";
  return ret;
}
function addline(what) { // output
  divelt.innerHTML += "<br />\n" + what;
}
</script>
</head>
<body>
<button onclick="alert('I\'m alive!');"> Hit me to see if I'm alive </button>
</body>
</html>

0

有几种方法可以解决这个问题。如果我们使用 setTimeout 函数,让我们先了解一下它。 这个函数 有三个参数:functioncodedelay(以毫秒为单位)和 parameters。 由于需要 functioncode 参数,其他参数是可选的。 如果您没有输入 delay,它将被设置为零。

有关 setTimeout() 的更多详细信息,请 转到此链接

简化版本:

var a = 1 + 3;
var b;
console.log('a = ' + a);
setTimeout(function(){ 
    b = a + 4; 
    console.log('b = ' + b);
}, 1000);

输出:
a = 4
24       --> 活动超时列表的数字标识符
b = 8
使用参数传递:
var a = 1 + 3;
var b;
console.log('a = ' + a);
setTimeout(myFunction, 1000, a);

function myFunction(a)
{
    var b = a + 4;
    console.log('b = ' + b);
}

输出:
a = 4
25      --> 活动超时列表的数字标识符
b = 8
浏览器支持:
Chrome    Firefox    Edge    Safari    Opera 1.0        1.0        4.0     1.0        4.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接