我想要实现函数队列,它应该根据传入的时间延迟执行。如果在延迟之前调用队列中的任何函数,则队列不能执行该函数,应该移动到队列中的下一个函数。
例如:
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 不会打印。
全心全意,
答案 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
}
}