模拟定时异步调用

7
我试图模拟一个异步回调,在一定的时间内执行某些操作。我希望它们在被触发后的3秒钟内同时记录。目前它们是连续记录,每隔3秒记录一次。sleep函数会阻塞整个脚本的运行。有任何想法吗?

function sleep(delay) {
  var start = new Date().getTime();
  while (new Date().getTime() < start + delay);
}

var same = function(string, callback) {
  new sleep(3000);
  return callback(string);
}

same("same1", function(string) {
  console.log(string);
});
same("same2", function(string) {
  console.log(string);
});
same("same3", function(string) {
  console.log(string);
});


1
https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout - Felix Kling
1
“为什么会这样呢?” 因为JavaScript是单线程的,而你不断地运行循环。 - Felix Kling
1
Javascript是单线程的。你不能这样做。 - SLaks
1
可能是在JavaScript中引入延迟的某种方法吗?的重复问题。 - Felix Kling
1
@FelixKling 单线程,是的! - ThomasReggi
2个回答

15

使用setTimeout()来安排将来的某个时间执行的事情。

setTimeout()是异步的,而你的循环不是。

var same = function(str, callback){
    setTimeout(function() {
        callback(str);
    }, 3000);
}

注意:由于异步的原因,您无法从异步回调中返回值。same()函数会在实际调用回调之前就已经完成并返回。


10

使用ES6,你可以基于一个辅助延迟函数使用以下技术:

const delay = async (delay = 1000, callback = () => {}) => {        

  const delayPromise = ms => new Promise(res => setTimeout(res, ms))
  await delayPromise(delay)

  callback()
}

const funcCallback = () => { console.info('msg WITH delay > 2') }

delay(5000, funcCallback)
console.info('Instant msg > 1')

我为什么要在这里使用Promise而不是简单地使用setTimeout()?使用Promise的好处是什么? - Rishab Gupta

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