我有一个用于发送消息的功能,在一秒钟内被多次调用。 但是我想每秒调用一次该函数,并在上一次调用的另外1秒内延迟该函数的其他调用。 这样一来,只有该函数在后台运行并每秒调用一次,无论调用多少次,都会使每次调用延迟一秒。
例如:
function foo(a) {
console.log(a)
}
foo('one');
foo('two');
foo('three');
在上面的示例中,foo在一个秒内被调用了3次,但是我想让它被调用,就像在1秒之后,它应该在2秒后返回“ 1”,然后应该返回“ second”,依此类推,异步。
我该怎么做?
我正在使用的技术是Javascript。
谢谢
答案 0 :(得分:0)
您可以使用它先运行主代码,然后再运行一些其他代码。
function firstfunction() {
alert('I am ran first');
setTimeout(function(){ alert('I am ran 3 seconds later') }, 3000);
}
<button onclick="firstfunction();">click me</button>
答案 1 :(得分:0)
这是一个简单的队列系统,它基本上只是将函数推入数组,然后每秒将它们拼接起来。
const queue = [];
setInterval(function () {
if (!queue.length) return;
const f = queue[0];
queue.splice(0, 1);
f();
}, 1000);
function foo(a) {
queue.push(function () {
console.log(a)
});
}
foo('one');
foo('two');
foo('three');
答案 2 :(得分:0)
这是我想出的第一件事-也许很粗糙。
var queuedUpCalls = [];
var currentlyProcessingCall = false;
function foo(a) {
if (currentlyProcessingCall) {
queuedUpCalls.push(a);
return;
}
currentlyProcessingCall = true;
setTimeout(function(){
console.log(a);
currentlyProcessingCall = false;
if (queuedUpCalls.length) {
var nextCallArg = queuedUpCalls.shift();
foo(nextCallArg);
}
},1000);
}
foo('one');
foo('two');
foo('three');
对于每个呼叫,如果您当前未在处理呼叫,则只需延迟setTimeout
毫秒即可呼叫1000
。如果您正在处理呼叫,请保存参数,然后在您开始的setTimeout
完成后进行处理。
使用setInterval
,答案有所改善:
var queuedUpCalls = [];
var timerId;
function foo(a) {
queuedUpCalls.push(a);
if (timerId) {
return;
}
timerId = setInterval(function(){
if (!queuedUpCalls.length) {
clearInterval(timerId);
timerId = null;
return;
}
var nextCallArg = queuedUpCalls.shift();
console.log(nextCallArg);
}, 1000);
}
foo('one');
foo('two');
foo('three');
答案 3 :(得分:0)
function foo(a)
{
if (typeof foo.last == 'undefined')
foo.last = Date.now();
var now = Date.now();
if (now - 1000 > foo.time)
foo.last = now;
setTimeout(function()
{
console.log(a);
}, (foo.last += 1000) - now);
}
这将使每个console.log
呼叫以1秒的间隔排队,第一个呼叫也将延迟1秒。
答案 4 :(得分:0)
您可以这样做:
function foo() {
console.log(“ran”);
}
setInterval(foo, 1000);
在最后一行中,有意编写不带括号的foo()。如果添加括号,则该行不起作用。