Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 06.09.2021, 10:49
Интересующийся
Отправить личное сообщение для uzlprog Посмотреть профиль Найти все сообщения от uzlprog
 
Регистрация: 04.09.2021
Сообщений: 11

Цитата:
Цикл for (var k = 1; k <= N; k++) быстренько пробежится и закончится. Он не будет ждать пока будут срабатывать все вызовы timout.
А как задать циклу for задержку?
Ответить с цитированием
  #12 (permalink)  
Старый 06.09.2021, 11:14
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от uzlprog
А как задать циклу for задержку?
Какую?

const arr0 = [0,1,2,3,4]; // Исходный массив
let a; // Будет каждую сек циклически получать значение следующего элемента
function f(arr, i = 0) {
  i %= arr.length;
  a = arr[i];
  setTimeout(() => {() => f(arr, i+1), 1000);
}

f(arr0);


Запустили цикл с таймерами. Сначала а=0, через секунду а=1, потом а=2 и т.д.
Дальше чего вы хотите?
В какой момент времени вы хотите получить другой массив и чем его заполнять?

Только учтите, что в javascript работающий код никто не может прервать. Пока он не завершится (например какой нибудь цикл) никакое другое событие обрабатываться не будет. Даже функция заданная в таймере.
setTimeout - это не выполни функцию через заданное время (как неправильно пишут во многих учебниках). Это поставь функцию в очередь на выполнение через заданное время. А выполняться она будет, когда дойдет очередь. Если какая то задача в очереди (даже та сама, которая вызвала setTimeout будет работать слишком долго, то функция, заданная в setTimeout будет ждать.

Последний раз редактировалось voraa, 06.09.2021 в 11:30.
Ответить с цитированием
  #13 (permalink)  
Старый 06.09.2021, 12:07
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от uzlprog
Задача такая: есть массив данных arr, мне нужно стряпать функцию, которая бесконечно (по кругу) перебирает значения каждого элемента массива через определенное время (1 сек) и присваивает это значение переменной a. При обращении она должна возвращать текущее значение переменной а.
function createFunc(arr, interval) {
    let i = 0;
    setInterval(() => { i = (i + 1) % arr.length; }, interval);
    return () => arr[i];
}


const func = createFunc([11, 22, 33, 44], 1000);

...

// будет возвращать тот элемент массива, который сейчас выбран. 
// выбор меняется раз в секунду по кругу
alert(func());


как вариант, можно добавить в функцию останавливатель и запускатель таймера, но кажется это сейчас без надобности.
так же - запускать таймер при первом вызове функции, а не при создании. Это надо?

Последний раз редактировалось Alexandroppolus, 06.09.2021 в 12:14.
Ответить с цитированием
  #14 (permalink)  
Старый 07.09.2021, 07:29
Интересующийся
Отправить личное сообщение для uzlprog Посмотреть профиль Найти все сообщения от uzlprog
 
Регистрация: 04.09.2021
Сообщений: 11

Цитата:
Запустили цикл с таймерами. Сначала а=0, через секунду а=1, потом а=2 и т.д.
Дальше чего вы хотите?
В какой момент времени вы хотите получить другой массив и чем его заполнять?
Через каждую секунду значение переменной а меняется - это понятно, так и должно быть.

Первый вариант:

Мне нужно получать значение переменной через некоторое время t. Допустим через 9 сек. То есть какое значение будет принимать a каждые 9 сек. (при условии что а меняет свое значение каждую секунду). Заранее это время t не определено. То есть время через которое мне нужно снимать значение переменной а каждый раз разное. Вот значениями, которое а принимает через заданное на один сеанс запуска скрипта время t мне и нужно заполнять массив.

Второй вариант:

Пользователь кликает по кнопке и текущее значение а добавляется в массив. Но второй вариант не обязателен.
Ответить с цитированием
  #15 (permalink)  
Старый 07.09.2021, 08:43
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

uzlprog, второй вариант прост:
<input type="button" id="button" value="add a"/>
<div>Выходной массив: <span  id="out">[]</span></div>
<script>
var a;
var arr = [1, 2, 3, 4, 5];
var outArr = [];
function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  setTimeout(() => {
    f(i);
  }, 1000);
}
f();

function add() {
  outArr.push(a);
  out.innerHTML = JSON.stringify(outArr);
}

button.onclick = add;
</script>


Первый вариант не будет иметь никакой точности. Потому что время срабатывания таймеров не может быть точным. Ты думаешь что при интервале в 1 секунду обновления а, если спрашивать каждую 9ую секунду получишь 9ое значение а? А вот и нет. Там может быть 8ое или 10ое, а может и 35ое, если ты вкладками щёлкал или запускал что-то с нагрузкой процессора.
Таймер не гарантируют точное время, при установке таймера в N он сработает после N. Когда после - зависит от окружения.

<input type="button" id="button" value="stop"/>
<div>Выходной массив: <span  id="out">[]</span></div>
<script>
var a;
var arr = [1, 2, 3, 4, 5];
var outArr = [];
function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  setTimeout(() => {
    f(i);
  }, 1000);
}
f();

function add() {
  outArr.push(a);
  out.innerHTML = JSON.stringify(outArr);
}

function fill(t = 9) {
  add();
  fill.timerId = setTimeout(() => {
    fill(t);
  }, t * 1000);
}
fill();

button.onclick = () => clearTimeout(fill.timerId);
</script>
__________________
29375, 35

Последний раз редактировалось Aetae, 07.09.2021 в 08:55.
Ответить с цитированием
  #16 (permalink)  
Старый 07.09.2021, 10:58
Интересующийся
Отправить личное сообщение для uzlprog Посмотреть профиль Найти все сообщения от uzlprog
 
Регистрация: 04.09.2021
Сообщений: 11

Aetae, спасибо. С пользовательским вводом я разобрался, а вот первый вариант... Ваш код почему-то у меня выдает:
Выходной массив: [1]


И все...
Ответить с цитированием
  #17 (permalink)  
Старый 07.09.2021, 10:59
Интересующийся
Отправить личное сообщение для uzlprog Посмотреть профиль Найти все сообщения от uzlprog
 
Регистрация: 04.09.2021
Сообщений: 11

Цитата:
Первый вариант не будет иметь никакой точности. Потому что время срабатывания таймеров не может быть точным. Ты думаешь что при интервале в 1 секунду обновления а, если спрашивать каждую 9ую секунду получишь 9ое значение а? А вот и нет. Там может быть 8ое или 10ое, а может и 35ое, если ты вкладками щёлкал или запускал что-то с нагрузкой процессора.
Таймер не гарантируют точное время, при установке таймера в N он сработает после N. Когда после - зависит от окружения.
Этот момент я не учел. Но теперь уже просто интересна реализация.
Ответить с цитированием
  #18 (permalink)  
Старый 07.09.2021, 13:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Сообщение от uzlprog Посмотреть сообщение
Aetae, спасибо. С пользовательским вводом я разобрался, а вот первый вариант... Ваш код почему-то у меня выдает:
Выходной массив: [1]


И все...
Подожди 9+ секунд.)
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать значения переменной из одного фрейма в другой в Google Chrome Freestyle007 Events/DOM/Window 17 20.06.2019 14:28
Имя массива из переменной Anderson Общие вопросы Javascript 7 24.02.2017 07:56
Изменение значения переменной в режиме реального времени The_FactioN jQuery 3 09.03.2016 12:20
Перебор массива - вложенный цикл SWin Общие вопросы Javascript 35 27.12.2013 05:06
Преобразование значения переменной в строку leny Общие вопросы Javascript 3 01.10.2011 22:34