2016-10-10 4 views
1

Я не уверен, как лучше объяснить, что я пытаюсь сделать, поэтому я приведу пример.Повторите функцию 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, но мне кажется, что там должно быть лучшим решением.

+0

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

ответ

8

Вы можете использовать крышку для счетчика.

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);

+0

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

+0

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

+0

@Nina, вы случайно использовали' array.entries'? Как сбросить итератор на '0'? [Пример скрипта] (https://jsfiddle.net/RajeshDixit/h4orbtvs/1/) – Rajesh

0

С помощью рекурсивной функции с приращением индекс

(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 ** оценивает пройденную строку внутри. Плохо для сторон безопасности. – bash0ne

+0

@ bash0ne - зачем 'setTimeout' оценивать что-либо, если вы не передадите ему строку? – adeneo

+0

Настоящая история, под редакцией. @adeneo – bash0ne

1

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

currentString = 0; 

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

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

    currentString = (currentString + 1) % 3; 
} 
+0

Это хорошее решение, но лучше с закрытием. –

+0

Да, правда, что :) – JohnnyAW

1

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

Почему вы должны изобретать модулю? – JohnnyAW

+0

Прохладный не думал об этом. Гораздо чище – synthet1c

+1

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

0

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

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);

Смежные вопросы