Перебор эл. массива с целью присвоения значения переменной.
Всем доброго дня! Задача такая: есть массив данных 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)? Или при такой конструкции не получится вернуть текущее значение? |
"...при обращении к переменной" наверное у тебя в задаче было.
И у тебя уже всё работает. Запустил функцию - она в фоне работает, в любой момент можешь в консоли написать console.log(a) и увидеть текущую a. Куда ты хочешь что return - непонятно. В общем что-то ты не так понял в задании, и сам небось не понимаешь конечного результата. |
:) :write:
<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>
|
Цитата:
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);
}
|
рони, спасибо, но я пытаюсь понять почему не работает вышеописанный пример.
|
Все разобрался, я обернул код в функцию, но ее не вызываю, соответственно a у меня вообще не генерится))
|
Все равно столкнулся с проблемой. Код генерирует 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/>');
}
}
Вообще не робит(((... |
Трудно понять чего вы хотите.
Что бы функция f начала выполняться, ее надо вызвать. Где вызов? Цикл for (var k = 1; k <= N; k++) быстренько пробежится и закончится. Он не будет ждать пока будут срабатывать все вызовы timout. Изучайте возможности асинхронного программирования в javascipt. Promise, async/await. |
Формализую задачу: необходимо создать массив, и заполнить его динамическим значением переменной a, которая с периодом в 1 сек. принимает значения элементов первоначального массива.
|
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/>');
}
}
Что не правильно?! |
| Часовой пояс GMT +3, время: 22:02. |