Предполагая, что вы хотите остановиться на фамилии массива (поскольку в вашем вопросе неясно, как должен работать выбор имени), есть стратегия, которую вы можете использовать.
По сути, вместо того, чтобы перебирать продолжительность, вы хотите l oop через ваш массив listOfParticipants
. На каждой итерации мы уменьшаем продолжительность ожидания, прежде чем перейти к следующей итерации для l oop.
// Pseudo code!
async function roll() {
for (let i = 0; i < listOfParticipants.length; i++) {
// Wait for promise to resolve
await someKindOfPromise();
// Update name
document.getElementById('person_name').innerText = listOfParticipants[i];
}
}
. Это можно сделать с помощью async / await . Натив для l oop в ES6 поддерживает ожидание обещания, поэтому мы просто создаем метод, который возвращает обещание, которое разрешается через x
количество секунд:
// A simple promise that resolves after a specified duration
function wait(duration) {
return new Promise(resolve => {
window.setTimeout(resolve, duration);
});
}
После x
числа вторые проходы, мы переходим к следующей итерации.
Значение x
может быть просто определено путем уменьшения предварительно установленной длительности на основе нашего относительного положения вдоль массива участников. Чем дальше вы находитесь в массиве (указан индексом i
), тем короче вы хотите, чтобы время было, например: delay * i / listOfParticipants.length;
async function roll() {
const delay = 100;
for (let i = 0; i < listOfParticipants.length; i++) {
// Force the for loop to wait for a set amount of time
const duration = delay * i / listOfParticipants.length;
await wait(duration);
// Once the duration has been awaited, we can then update the inner text
document.getElementById('person_name').innerText = listOfParticipants[i];
}
}
См. Подтверждение концепции ниже:
const listOfParticipants = ['Adena', 'Socorro', 'Germaine', 'Ebony', 'Raul', 'Anton', 'Rochel', 'Morgan', 'Joanie', 'Ellsworth', 'Edelmira', 'Susannah', 'Gino', 'Vicenta', 'Katrina', 'Devorah', 'Olinda', 'Lise', 'Napoleon', 'Dessie', 'Herta', 'Cassaundra', 'Nadine', 'Dalton', 'Mica', 'Haydee', 'Linh', 'Williemae', 'Desiree', 'Philomena', 'Julio', 'Darell', 'Shana', 'Ligia', 'Melita', 'Laurene', 'Darby', 'Gregg', 'Shemika', 'Tesha', 'Benita', 'Hyman', 'Kattie', 'Mary', 'Julienne', 'Claud', 'Heather', 'Toney', 'Vasiliki', 'Stephani', 'Violette', 'Barney', 'Warren', 'Felix', 'Mathew', 'Blair', 'Jamar', 'Grover', 'Bud', 'Barbie', 'Gina'];
// A simple promise that resolves after a specified duration
function wait(duration) {
return new Promise(resolve => {
window.setTimeout(resolve, duration);
});
}
async function roll() {
const delay = 100;
for (let i = 0; i < listOfParticipants.length; i++) {
// Force the for loop to wait for a set amount of time
const duration = delay * i / listOfParticipants.length;
await wait(duration);
// Once the duration has been awaited, we can then update the inner text
document.getElementById('person_name').innerText = listOfParticipants[i];
}
}
document.querySelector('#btn').addEventListener('click', () => roll());
<h1 class="text-center mt-2" id="person_name"></h1>
<button id="btn">Raffle</button>