【问题标题】:Simulate a timed async call模拟定时异步调用
【发布时间】:2013-12-18 12:38:06
【问题描述】:

我正在尝试模拟一个异步回调,它在设定的秒数内执行某些操作。我希望这些都同时记录,在它们被触发后 3 秒。现在他们彼此连续记录 3 秒。睡眠功能阻止整个脚本运行。知道为什么吗?

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);
});

【问题讨论】:

标签: javascript asynchronous sleep


【解决方案1】:

使用setTimeout() 为将来的时间安排一些事情。

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

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

注意:您不能从异步回调中返回值,因为它是异步的。函数same() 在回调实际调用之前很久就完成并返回。

【讨论】:

    【解决方案2】:

    在 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-04
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      相关资源
      最近更新 更多