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