JavaScript setInterval函数可能有也可能没有参数

时间:2016-05-28 17:27:19

标签: javascript function

我正在处理一个简单的高阶函数delay,它将调用一个函数参数func,然后延迟一段时间wait。我已经阅读了有关放置参数的位置的其他答案,但我找到的答案都没有解决我需要学习的问题:我应该在哪里以及如何允许可能传递给func的参数?

原始指令:“等待毫秒后调用func。调用func时会向func提供任何其他参数。”

这是基本的开始:

function delay(func, wait) {
    setInterval(func, wait);
}

关于SO的另一个答案是,可以使用匿名函数来包装func参数,以便可以在那里传递参数,但是我还没有成功构建它。

非常感谢指导。

6 个答案:

答案 0 :(得分:1)

我认为正确的建模方法是承认延迟只是副作用,不应该有参数。延迟应该只是延迟而且就是这样。

您可能还希望使用promises作为新的(ish)标准语言方式来执行信号异步操作:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

请参阅this question and answer,了解new Promise部分的功能以及承诺API的含义。

然后,您可以与函数调用分开使用延迟:

delay(1000).then(fn);
delay(1000).then(() => fn(arg1, arg2, arg3));

等等。

如果您想继续使用回调

setTimeout实际上已经做了你要求的事情,setTimeout(fn, 1000)是调用超时的简单方法,但你可以在延迟量和函数之后将其他参数传递给函数跟他们打电话。

答案 1 :(得分:0)

可能是这个链接:

function delay(func, wait,funcArguments) {
    setInterval(function() {
        funcArguments = funcArguments  || [];
        func.call(null, funcArguments);
    }, wait);
}

funcArguments是带参数的数组。

答案 2 :(得分:0)

听起来你需要使用arguments伪数组和Function#apply

function delay(func, wait) {
  // get all arguments after the first two
  var args = Array.prototype.slice.call(arguments, 2);

  setTimeout(function() {
    func.apply(null, args);
  }, wait);
}

实施例:



function delay(func, wait) {
  var args = Array.prototype.slice.call(arguments, 2);

  setTimeout(function() {
    func.apply(null, args);
  }, wait);
}

function outputPerson(firstName, lastName) {
    console.log("Hello, " + firstName + " " + lastName);
}

delay(outputPerson, 3000, "John", "Doe");




修改:正如Patrick Evans和我在评论中指出的那样setTimeout 已经提供了此处描述的功能(只要你是'不使用IE< 10)。所以你甚至可以像这样定义delay函数:

var delay = setTimeout;

答案 3 :(得分:0)

通常在图书馆中,他们将其命名为debounce,您可以像下面这样实现它:

function debounce(func, wait=0,args=[]) {
    setTimeout(function() {
        func.call({}, args);
    }, wait);
}

但正确的实施,如lodash的here,要复杂得多。

答案 4 :(得分:0)

您只需添加setInterval

的参数即可
var intervalID = window.setInterval(func, delay[, param1, param2, ...]);



function delay(func, wait, param) {
    setInterval(func, wait, param);
}


function hello(x) {
    var p = document.createElement('p');
    p.innerHTML = 'Hello ' + x + '!';
    document.body.appendChild(p);
}

delay(hello, 1000, 'world');




答案 5 :(得分:0)

这是一个简单的解决方案:

function delay(func, wait, ...param) {
  setTimeout(function(){func(param);}, wait);
}
function doit(a){console.log(a);}

delay(doit,500,'test1','test2');
//['test1','test2']