每秒调用一次函数max

时间:2018-10-31 21:31:16

标签: javascript

我有一个用于发送消息的功能,在一秒钟内被多次调用。 但是我想每秒调用一次该函数,并在上一次调用的另外1秒内延迟该函数的其他调用。 这样一来,只有该函数在后台运行并每秒调用一次,无论调用多少次,都会使每次调用延迟一秒。

例如:

function foo(a) {
  console.log(a)
}
foo('one');
foo('two');
foo('three');

在上面的示例中,foo在一个秒内被调用了3次,但是我想让它被调用,就像在1秒之后,它应该在2秒后返回“ 1”,然后应该返回“ second”,依此类推,异步。

我该怎么做?

我正在使用的技术是Javascript。

谢谢

5 个答案:

答案 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()。如果添加括号,则该行不起作用。