Один из вариантов: diceSimulation
возвращает Promise
, которое разрешается через 50 * 31
мс, а для rollDie
- await
it:
async function rollDie(){
await diceSimulation();
var result = Math.floor(Math.random() * 6) + 1;
document.getElementById("result").innerHTML = result;
return result;
}
function diceSimulation(){
return new Promise((resolve) => {
for (var i = 0; i < 30; i++) {
(function (i) {
setTimeout(function () {
const random = Math.floor(Math.random() * 6) + 1;
document.getElementById("result").innerHTML = random;
}, 50*i);
})(i);
}
setTimeout(resolve, 1530);
});
}
Обратите внимание, что вместо (function (i) {
внутри цикла, вы можете рассмотреть возможность использования let
вместо var
, гораздо приятнее читать и отлаживать.(Использование var
имеет слишком много проблем - лучше использовать вместо него const
или let
, когда это возможно.) Было бы также более элегантно выбрать result
один раз внутри diceSimulation
, а нечем на каждой итерации цикла, и если вы не намеренно вставляете разметку HTML, лучше назначить testContent
, а не innerHTML
:
const result = document.getElementById("result");
for (let i = 0; i < 30; i++) {
setTimeout(() => {
const random = Math.floor(Math.random() * 6) + 1;
result.textContent = random;
}, 50*i);
}
Демонстрационная версия:
async function rollDie() {
await diceSimulation();
var result = Math.floor(Math.random() * 6) + 1;
document.getElementById("result").innerHTML = result;
return result;
}
function diceSimulation() {
return new Promise((resolve) => {
const result = document.getElementById("result");
for (let i = 0; i < 30; i++) {
setTimeout(() => {
const random = Math.floor(Math.random() * 6) + 1;
result.textContent = random;
}, 50 * i);
}
setTimeout(resolve, 1530);
});
}
rollDie();
<div id="result"></div>