Повторить функцию javascript с использованием нескольких переменных

#javascript

#javascript

Вопрос:

Я не уверен, как лучше всего объяснить, что я пытаюсь сделать, поэтому я приведу краткий пример.

Допустим, у меня есть функция JavaScript, подобная этой:

 function myFunction(){
    doSomething('text string here');
}
  

Мне нужно повторить эту функцию с заданным интервалом. Я могу сделать это с помощью setTimeout .

Однако текстовая строка, которую мне нужно использовать, — это не просто одна строка, у меня их три. Итак, моя функция будет выглядеть примерно так:

 function myFunction(){
    var stringOne = "My first string";
    var stringTwo = "My second string";
    var stringthree = "My third string";

    doSomething(*string variable name here*);
}
  

Итак, мне нужно вызывать функцию, скажем, каждые 10 секунд, но каждый раз, когда она запускается, ей нужно использовать следующую текстовую строку по порядку.

Поэтому мне нужно вызвать:

 myFunction, and have it use stringOne.
myFunction, and have it use stringTwo.
myFunction, and have it use stringThree.
And then start back at the first one again.
  

Я мог бы написать три отдельные функции и связать их вместе в цикле, используя setTimeout, но, похоже, должно быть лучшее решение.

Комментарии:

1. Используйте массив!!!

Ответ №1:

Вы могли бы использовать замыкание для счетчика.

 function myFunction() {
    var counter = 0,
        fn = function () {
            var array = ["My first string", "My second string", "My third string"];
            console.log(array[counter]);
            counter  ;
            counter %= array.length;
        };
        fn();
    return fn;
}
setInterval(myFunction(), 2000);  

Комментарии:

1. Из любопытства, какова была причина вашего последнего изменения кода? Код, который вы опубликовали ранее, кажется, работает? Еще один вопрос: как мне заставить эту функцию запускаться сразу в первый раз, а затем через указанный интервал после этого?

2. Вы можете использовать setTimeout с рекурсией

3. @Nina, вы случайно не использовали array.entries ? Как вы сбрасываете итератор на 0 ? Пример скрипки

4. @Rajesh, хотя я большой поклонник рекурсий, setInterval работает лучше для фиксированных обратных вызовов, чем setTimeout для и счетных вызовов, потому что он не использует стек больше, чем необходимо.

5. @NinaScholz Откуда у тебя столько знаний. Вы берете ученика? Но шутки в сторону, действительно ценю, что вы нашли время, чтобы объяснить вещи.

Ответ №2:

просто используйте глобальную переменную для отслеживания текущей строки:

 currentString = 0;
  

затем после каждого вызова увеличивайте значение и делите его по модулю:

 function myFunction(){
    switch(currentString){
    //print the current string
    }

    currentString = (currentString   1) % 3;
}
  

Комментарии:

1. да, это правда 🙂

Ответ №3:

 function myFunction(strings){
  var ii = 0
  function iterate(){
    // increment or reset the iterator
    doSomething(strings[ii   % strings.length])
    // call it again after 1 second (change this)
    setTimeout(iterate, 1000)
  }
  // kick off the iteration of your strings
  iterate()
}

function doSomething(val) {
  console.log(val)
}

// init the iterator with your strings
myFunction([
 'myFunction, and have it use stringOne.',
 'myFunction, and have it use stringTwo.',
 'myFunction, and have it use stringThree.'
])  

Комментарии:

1. зачем вам изобретать modulo?

2. Круто об этом не подумал. Намного чище

3. вы все равно должны использовать strings.length

Ответ №4:

Используйте рекурсивную функцию с увеличивающимся индексом

 (function myFunction(i){
   var arr = ["My first string", "My second string", "My third string"];
   
   setTimeout(function() {
       doSomething( arr[i = i < arr.length ? i : 0] );
       myFunction(  i);
    }, 1000);
})(0);

function doSomething(str) {
    console.log(str)
}  

Комментарии:

1. Имейте в виду, что setTimeout оценивает переданную строку внутри. Плохо для сторон безопасности.

2. @bash0ne — зачем setTimeout что-то оценивать, если вы не передаете ему строку?

3. @bash0ne — правдивая история как? Вы все еще думаете, что это оценивает код внутри тайм-аута?

4. Можно передать функции setTimeout строку в первом параметре, которая должна пройти eval() . Так что да

5. Я передаю не строку, а анонимную функцию, так как же это даже отдаленно актуально?

Ответ №5:

Нет необходимости в закрытии вообще; Не упоминается, но я также добавил тайм-аут. Просто сделайте так;

 var array = ["My first string", "My second string", "My third string"],
      sid;
function runner(i){
  console.log(array[i=i%array.length]); // i hate i growing indefinitely
  sid = setTimeout(_ => runner(  i),2000);
}

runner(0);
setTimeout(_ => clearTimeout(sid),20000);