@smarisov666

Как поставить задержку в цикле for?

function change(params) {
            vk.call('groups.edit', {
                group_id: 196543401,
                screen_name: params
            }).then((response) => {
                console.log(response)
                console.log(response.getFullResponse())
            }).catch((error) => {
                console.log(error);
            });
        }
        var array = fs.readFileSync('file.txt').toString().split("\n");
            for(i in array) {
                console.log(array[i]);
                setTimeout(function() {
                    change(array[i])
                }, 2000);
            }

Имею такой код, что только уже не перепробовал, суть проблемы, когда ставлю интервал, то console log выполняется спокойно, а потом просто флудит функцией settimeout уже с неактуальной информацией
мне нужно, чтобы при каждом новом значении i с задержкой в 5 секунд выполнялась функция change, как решить?
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
@GrayHorse
В очередной раз:
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

for (let i = 0; i < 10; i++) {    
    console.log(i);
    await sleep(500);
}


---

async function change(params) {
    try {
        const response = await vk.call("groups.edit", {
            group_id: 196543401,
            screen_name: params
        });
        console.log(response);
        console.log(response.getFullResponse());
    } catch (error) {
        console.log(error);
    }
}
        
const array = fs.readFileSync("file.txt").toString().split("\n");
for (const item of array) {
    console.log(item);
    await change(item);
    await sleep(1000);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
black1277
@black1277
Вольный стрелок
Вы умудрились наступить сразу на 2 грабли.
1 Замыкания
2 Асинхронный код в теле цикла
for (i in array){
    (function (m) {
        setTimeout(function () {
            change(array[m])
        }, 2000)
    })(i)
}

Код который я привел - разрулит замыкание, а в предыдущем ответе возьмите ф-ю для паузы и почитайте по ссылке про циклы.
Ответ написан
@Crone1331
Создай функцию, например timer
function timer(ms) {
    return new Promise(res => setTimeout(res, ms));
}

и вызывай её в асинхронной функции, где тебе нужна задержка
в твоем случае добавь async перед названием функции
async function change(params) {
...
await timer(1000);
}

подробнее можно прочитать тут
Ответ написан
dollar
@dollar
Делай добро и бросай его в воду.
Если i - это обычный индекс, то вместо 2000 просто напишите 2000*i
как-то так
for(i in array) {
	console.log(array[i]);
	let j = i;
	setTimeout(function() {
		change(array[j])
	}, 2000*i);
}

Хотя если массив слишком большой, то лучше вообще убрать цикл for и переписать его на setInterval(), например.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы