Javascript.RU

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

Перебор эл. массива с целью присвоения значения переменной.
Всем доброго дня! Задача такая: есть массив данных arr, мне нужно стряпать функцию, которая бесконечно (по кругу) перебирает значения каждого элемента массива через определенное время (1 сек) и присваивает это значение переменной a. При обращении она должна возвращать текущее значение переменной а.

Я новичок в JS, пробовал по разному, но не получается... Посоветовали сделать так:

let a;
function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  //console.log(a);
  setTimeout(() => {
    f(i);
  }, 1000);
}


Мне нужно вместо //console.log(a); вернуть текущее значение а. Я по разному переписывал этот код, но ничего не получается. Я не пойму в чем дело? Куда нужно вставить return(a)? Или при такой конструкции не получится вернуть текущее значение?
Ответить с цитированием
  #2 (permalink)  
Старый 04.09.2021, 12:52
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

"...при обращении к переменной" наверное у тебя в задаче было.
И у тебя уже всё работает. Запустил функцию - она в фоне работает, в любой момент можешь в консоли написать console.log(a) и увидеть текущую a. Куда ты хочешь что return - непонятно.

В общем что-то ты не так понял в задании, и сам небось не понимаешь конечного результата.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 04.09.2021, 19:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068


<script>
function fun(arr) {
    let time = performance.now();
    Object.defineProperty(window, "a", {
        get: function() {
            let i = Math.trunc((performance.now() - time)/1000) % arr.length;
            return arr[i]
        }
    });
    return window.a
}
fun([1, 2, 3, 4, 5]);
window.setInterval(_ => document.body.append(`${a} `) , 1001)
</script>
Ответить с цитированием
  #4 (permalink)  
Старый 06.09.2021, 08:15
Интересующийся
Отправить личное сообщение для uzlprog Посмотреть профиль Найти все сообщения от uzlprog
 
Регистрация: 04.09.2021
Сообщений: 11

Цитата:
В общем что-то ты не так понял в задании, и сам небось не понимаешь конечного результата.
Задание тут не причем, мне нужен практический результат. В функции основного скрипта (вызывается по действию пользователя) необходимо использовать переменную a значение которой выбирается из массива (100 элементов) перебор которых происходит циклически независимо в фоне. Перебор в фоне работает, а вот при использовании a у меня выдает unindeficated


var a;
function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  setTimeout(() => {
    f(i);
  }, 1000);
}

function N1() {
var b;
b = a + 12;
return(b);
}

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

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

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

Все равно столкнулся с проблемой. Код генерирует a один раз, то есть переменная у меня почему-то не меняется, если я например забью ее значением массив:

var a;
function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  setTimeout(() => {
    f(i);
  }, 1000);
}

function N1() {
let c = 0;
let arr2 = [];
let N = 100;
for (var k = 1; k <= N; k++) {
   arr2.push(a);
   document.write('Item: ' + arr2[c++] + ' of ' + arr2.length + '<br/>');
}
}


У меня выдает список, в котором все 100 элементов равны одному и тому же значению переменной a.

Соответственно, как я понимаю, чтобы динамически обращаться к первоначальному коду, нужно его обернуть в функцию,

function N0() {
var a;
function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  setTimeout(() => {
    f(i);
  }, 1000);
}
return(a);
}

function N1() {
let c = 0;
let arr2 = [];
let N = 100;
let b;
for (var k = 1; k <= N; k++) {
   b =  N0();
   arr2.push(a);
   document.write('Item: ' + arr2[c++] + ' of ' + arr2.length + '<br/>');
}
}


Вообще не робит(((...
Ответить с цитированием
  #8 (permalink)  
Старый 06.09.2021, 09:35
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,700

Трудно понять чего вы хотите.
Что бы функция f начала выполняться, ее надо вызвать. Где вызов?

Цикл for (var k = 1; k <= N; k++) быстренько пробежится и закончится. Он не будет ждать пока будут срабатывать все вызовы timout.

Изучайте возможности асинхронного программирования в javascipt.
Promise, async/await.
Ответить с цитированием
  #9 (permalink)  
Старый 06.09.2021, 10:41
Интересующийся
Отправить личное сообщение для uzlprog Посмотреть профиль Найти все сообщения от uzlprog
 
Регистрация: 04.09.2021
Сообщений: 11

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

var a;
async function f(i = 0) {
  if (i == arr.length) i = 0;
  a = arr[i++];
  setTimeout(() => {
    f(i);
  }, 1000);
}
f();
function N1() {
let c = 0;
let arr2 = [];
let N = 100;
let b;
for (var k = 1; k <= N; k++) {
   arr2.push(a);
   document.write('Item: ' + arr2[c++] + ' of ' + arr2.length + '<br/>');
}
}


Что не правильно?!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать значения переменной из одного фрейма в другой в 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