基于时间的函数队列

时间:2017-05-22 05:22:39

标签: javascript settimeout

我想要实现函数队列,它应该根据传入的时间延迟执行。如果在延迟之前调用队列中的任何函数,则队列不能执行该函数,应该移动到队列中的下一个函数。

例如:

function funQueue(message,date){

  //logic
}

var fn1=funQueue("message1",new Date().getTime()+500)
var fn2=funQueue("message2",new Date().getTime()+1000)
var fn3=funQueue("message3",new Date().getTime()+2000)
    fn2()

如上所述,它应该打印。

MESSAGE1

message3

请注意 message2 不会打印。

全心全意,

2 个答案:

答案 0 :(得分:2)

使用setTimeout()clearTimeout()

可能会有以下几点

function funQueue(message,date){
  var timeoutId = setTimeout(function() {  // schedule a timeout
    console.log(message)                   // that logs the message
  }, date - new Date().getTime())          // at the specified time
  
  return function() {                      // return a function
    clearTimeout(timeoutId)                // that cancels the timeout
  }
}

var fn1=funQueue("message1",new Date().getTime()+500)
var fn2=funQueue("message2",new Date().getTime()+1000)
var fn3=funQueue("message3",new Date().getTime()+2000)
fn2()

请注意,如果您使用过去的时间拨打funQueue(),它仍然会调用setTimeout(),这意味着在当前代码完成后会立即记录该消息,除非它在目前的代码。

编辑:我在评论中被要求实施它而没有多个同时超时。以下是第一种想到的方式。我确信这可以用更好的方式进行整理,优化和/或完全重写,但是当我第一次单击“运行”时它才起作用,所以我认为这是一个很好的起点。我将解释它如何作为读者的练习......

var funQueue = function() {
  var queue = []
  var timeoutId
  function setNext() {
    clearTimeout(timeoutId)
    if (queue.length > 0) {
      timeoutId = setTimeout(function() {
        console.log(queue.shift().message)
        setNext()
      }, queue[0].date - new Date().getTime())
    }
  }  
  return function(message,date){
    var item = { message: message, date: date }
    var i = 0
    while (i < queue.length && date >= queue[i].date) i++
    queue.splice(i, 0, item)
    setNext()
    return function() {  
      var i = queue.indexOf(item)
      if (i != -1) {
        queue.splice(i, 1)
        setNext()
      }
    }
  }
}()

var fn1=funQueue("message1",new Date().getTime()+500)
var fn2=funQueue("message2",new Date().getTime()+1000)
var fn3=funQueue("message3",new Date().getTime()+2000)
var fn4=funQueue("message4",new Date().getTime()+1500)
var fn5=funQueue("message5",new Date().getTime()+2000)
fn2()

答案 1 :(得分:0)

执行此类操作以检查时间是否已过去

var timePassed;
function funQueue(message, date){
  if(timePassed > date){
     timePassed = new Date.getTime();
     // Do stuff
  }
}