【问题标题】:How to call a function multiple times 1 second after the same function has been executed in a previous call? (javascript)如何在上一次调用中执行同一函数后 1 秒多次调用函数? (javascript)
【发布时间】:2017-05-03 21:21:16
【问题描述】:

我的问题是如何在一秒钟后调用函数“changeArray”?我希望在 1 秒后调用第一个“changeArray”,在 2 秒后调用下一个,依此类推。所以每个函数都应该在前一个函数执行后 1 秒被调用。

var array = [
    [0,0,0],
    [0,0,0],
    [0,0,0]
];

function changeArray(i,j) {
    array[i][j] +=1;
}

changeArray(1,1); //after 1 second
changeArray(1,1); //after 2 seconds
changeArray(0,0); //after 3 seconds
changeArray(0,0); //after 4 seconds

console.log(array);

【问题讨论】:

  • 您能否详细说明“具有不同参数”的部分?
  • 当我使用参数“1,1”调用 c​​hangeArray(1,1) 函数并在下一步中使用参数“0,0”调用 c​​hangeArray(0,0) 函数或“论据”,也许你可以这样称呼它们。我想要的是,当我调用 changeArray 4 次时,应该总是在 1 秒后调用它,并且应该在 4 步中每秒修改一次数组,直到 4 秒结束,然后我想要结果。

标签: javascript function timeout setinterval


【解决方案1】:

如果没有关于如何决定将哪些参数传递给changeArray 的规则,您可以试试这个:

function addInterval(func, i) {
    window.setTimeout(function() {
        func();
    }, 1000 * i);
}

addInterval(() => changeArray(1, 1), 1);
addInterval(() => changeArray(1, 1), 2);
addInterval(() => changeArray(0, 0), 3);
addInterval(() => changeArray(0, 0), 4);

【讨论】:

  • 当我尝试将您的示例与我的“TypeError: functions[i] is not a function. (In 'functions[i]()', 'functions[i] ' 未定义)”。
  • @bady 我更改了代码以使其正常工作。这是其他评论者提到的关闭问题
  • 谢谢,它接近我需要的东西,它的工作方式几乎就像我想要的那样,但是如果它更有活力会更好。我的意思是在这种情况下,每当我想添加另一个函数时,我都必须将它传递给调度程序......是否可能有动态方式,例如有类似 schedule(changeArray(1,1),1) 最后一个代表函数将在其中执行的第二个?下一个像 changeArray(1,1),2) 和 2 秒后?
  • 我改了,更容易理解,更灵活。 addInterval 方法现在只是“隐藏” setTimeout 方法的辅助方法。
  • 我只是想补充一点,箭头函数是 ES6 的特性,所以不要指望它适用于“旧浏览器”,除非你有类似 babel 的东西。
【解决方案2】:

您可以使用窗口setTimeout 方法。如果您需要更好的语法或在循环中使用它,您可以定义下面的辅助方法:

defer = function(method, seconds, args) {
  var fn = function() {
      return method.apply(null, args);
  }

  return setTimeout(fn, seconds * 1000);
}

然后像这样使用它:

defer(changeArray, 1, [1, 1]);
defer(changeArray, 2, [1, 1]);
defer(changeArray, 3, [0, 0]);
defer(changeArray, 4, [0, 0]);

或者在for循环中:

var count = 1;
for(var i = 0; i < array.length; i++) {
    var row = array[i];
    for(var j = 0; j < row.length; j++) {
        defer(changeArray, count, i, j);
        count++;
    }
}

【讨论】:

  • 我试过了,我不知道为什么,但是所有函数都在第一秒执行了......我不能像这样使用它: defer(changeArray(1, 1 ), 1); ?
  • 否,因为changeArray(1, 1) 正在立即执行函数并将结果作为第一个参数传递给 defer。我再次测试并看到工作。 defer 的第二个参数应该是所需的“超时”。
【解决方案3】:

查看setTimeoutsetInterval

setTimeout(() => changeArray(1,1), 1000); //after 1 second

【讨论】:

  • 我已经检查过了,但问题是我想修改changeArray函数,以便在一秒钟后第一次调用它,然后每次调用changeArray,它应该在前一个 changeArray 函数执行后 1 秒调用。在代码中也是一个例子,我已经注释了当我想要调用哪个函数时。
【解决方案4】:
var counter=0
setInterval(function(){
++window.counter;
var a, b;
if (window.counter== /*however many seconds */ ) {
a=//what ever you want for the time passed
b=//what ever you want for the time passed
}
// add more if statements like that for different times
changeArray(a, b);
 }, 1000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多