代码执行中的同步延迟

kav*_*ita 27 javascript jquery settimeout

我有一个代码,需要在延迟说5000毫秒后执行.目前我使用的是setTimeout但它是异步的,我希望执行等待它的返回.我尝试过使用以下内容:

function pauseComp(ms) 
 {
     var curr = new Date().getTime();
     ms += curr;
     while (curr   < ms) {
         curr = new Date().getTime();
     }
 } 
Run Code Online (Sandbox Code Playgroud)

但我想延迟的代码是使用raphaeljs绘制一些对象,并且显示器根本不是平滑的.我正在尝试使用doTimeout插件.我只需要延迟一次,因为延迟和要延迟的代码都在循环中.我没有要求身份证,所以我没有使用它.例如:

for(i; i<5; i++){ $.doTimeout(5000,function(){
         alert('hi');  return false;}, true);}
Run Code Online (Sandbox Code Playgroud)

这等待5秒钟,然后给出第一个Hi,然后连续循环迭代在第一个之后立即显示警报.我想要它做的是等待5秒再次提醒警报等待然后提供警报等等.

任何提示/建议表示赞赏!

Thi*_*obo 48

接受的答案的变化与这个一样好.

此外,我同意优选setTimeout和异步函数调用的注意事项,但有时例如,在构建测试时,您只需要一个同步等待命令...

function wait(ms) {
    var start = Date.now(),
        now = start;
    while (now - start < ms) {
      now = Date.now();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要它在几秒钟内,在while检查时将开始ms除以1000 ...

  • 请注意CPU的使用. (5认同)
  • 当然,@JosephLust。它应该只用于测试而不是生产代码的另一个原因。 (3认同)

Lin*_*Lin 18

同步等待(仅用于测试!):

const syncWait = ms => {
    const end = Date.now() + ms
    while (Date.now() < end) continue
}
Run Code Online (Sandbox Code Playgroud)

用法:

console.log('one')
syncWait(5000)
console.log('two')
Run Code Online (Sandbox Code Playgroud)

异步等待:

const asyncWait = ms => new Promise(resolve => setTimeout(resolve, ms))
Run Code Online (Sandbox Code Playgroud)

用法:

(async () => {
    console.log('one')
    await asyncWait(5000)
    console.log('two')
})()
Run Code Online (Sandbox Code Playgroud)

替代(异步):

const delayedCall = (array, ms) =>
    array.forEach((func, index) => setTimeout(func, index * ms))
Run Code Online (Sandbox Code Playgroud)

用法:

delayedCall([
    () => console.log('one'),
    () => console.log('two'),
    () => console.log('three'),
], 5000)
Run Code Online (Sandbox Code Playgroud)


mic*_*lof 9

如果您想利用新的async / await语法,可以将set timeout转换为promise,然后等待它。

function wait(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Done waiting");
      resolve(ms)
    }, ms )
  })
}  

(async function Main() {
  console.log("Starting...")
  await wait(5000);
  console.log("Ended!")
})();
Run Code Online (Sandbox Code Playgroud)


Ove*_*ous 5

JavaScript是一种单线程语言.您无法组合setTimeout和同步处理.会发生什么,计时器将会失效,但JS引擎将等待处理结果,直到当前脚本完成.

如果你想要同步方法,只需直接调用方法!

如果要在setTimeout之后处理某些内容,请将其包含在内或从超时函数中调用它.


Ric*_*all 5

使用新的 Atomics API,您可以启动同步延迟而不会出现性能峰值:

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

sleep(5000) // Sleep for 5 seconds

console.log("Executed after 5 seconds!")
Run Code Online (Sandbox Code Playgroud)