Задержка Javascript внутри цикла for с массивом

avatar
Ismar Perez
7 апреля 2018 в 22:17
1506
2
0

Эй, ребята, я в тупике, у меня есть этот фрагмент кода. Которые получают некоторые данные из листов Google и помещают их в массив. Чтобы быть более конкретным, он получает адрес и сумму. Это создает массив маленьких массивов внутри массива. Затем я получаю массив и перебираю его, но я хочу, чтобы он остановился на 10 секунд перед следующим массивом. Вот что у меня есть:

                const randomArray = [];
                for (var i = 0; i < rows.length; ++i) {
                    let row = rows[i];
                    randomArray.push(row);
                }
     for (const data of randomArray) {
                    setTimeout(() => {
                        const AddressID = data[0];
                        const Amount = parseFloat(data[1]);
                        console.log(AddressID, Amount);
                    }, 5 * 1000);
                }
            }

Всего 4 адреса и 4 суммы. Мне нужно, чтобы он сделал (адрес, количество), остановился на 10 секунд и сделал это снова, пока не дойдет до последнего. То, что я сделал, ждет 5 секунд, а затем просто выдает все 4 адреса и суммы за один раз.

Источник
Darkrum
7 апреля 2018 в 22:27
0

Возможный дубликат Как добавить задержку в цикле JavaScript?

Ответы (2)

avatar
PolymorphismPrince
7 апреля 2018 в 22:29
-1

Ключ в том, чтобы использовать обычный цикл for вместо цикла of for, чтобы можно было получить индекс массива:

const randomArray = [];
  for (var i = 0; i < rows.length; ++i) {
    let row = rows[i];
    randomArray.push(row);
  }
 for (var j = 0; j < randomArray.length; j++) {
        var data = [randomArray[j]];
    setTimeOut(() => { console.log("Delay")}, j * 5000);
    const AddressID = data[0];
    const Amount = parseFloat(data[1]);
    console.log(AddressID, Amount);
    }

Это должно срабатывать каждые пять секунд, просто измените 5000 на любое другое.

avatar
Kristianmitk
7 апреля 2018 в 22:28
0
  • Используйте setTimeout вместо setInterval
  • Перебрать массив и в зависимости от индекса установить правильный интервал ожидания выполнения обратного вызова (т.е. i * 10000 вместо 5 * 1000 для задержки, где i — текущий индекс в массиве)
  • используйте Array#map вместо обычного цикла for, поскольку при выполнении обратных вызовов цикл будет завершен, и переменная индекса не будет содержать правильное значение

Демо

let randomArray = [[1,10], [2,20], [3,30], [4,40]];

randomArray.map((el,i) => {
  setTimeout(() => {
    const AddressID = el[0];
    const Amount = parseFloat(el[1]);
    console.log(AddressID, Amount);
  }, i * 10000);
});

Еще один способ — использовать рекурсивную функцию, которая создает новый тайм-аут каждый раз, когда выполняется обратный вызов предыдущего, пока вы не зациклитесь на массиве

Демо

let randomArray = [[1,10], [2,20], [3,30], [4,40]],
    i = 0;
    
(function loop() {
  setTimeout(() => {
    const AddressID = randomArray[i][0];
    const Amount = parseFloat(randomArray[i][1]);
    console.log(AddressID, Amount);
    i++;
    if(i < randomArray.length)
      loop();
  }, i * 10000);
})();
Ismar Perez
7 апреля 2018 в 22:43
0

Эй, мужик, спасибо за ответ, я вставил неправильный фрагмент кода, я изменил его сейчас. Я хотел сказать вам, что я не могу разрешить строки, потому что некоторые документы листов имеют более 100 адресов и сумм. Это только тестовый.