javascript - 在返回值之前等待 setTimeout 完成 Javascript
问题描述
我正在制作一个简单的骰子游戏,并且我设置了一个函数,该函数将随机生成数字并非常快速地显示它们以模拟一种正在滚动的骰子。我遇到的问题是我想等到模拟完成后再返回值,而是立即返回值。谁能指出我正确的方向?本质上,我希望 rollDie() 在继续之前等待 diceSimulation() 完成。
function rollDie(){
diceSimulation();
var result = Math.floor(Math.random() * 6) + 1;
document.getElementById("result").innerHTML = result;
return result;
}
function diceSimulation(){
for (var i = 0; i < 30; i++) {
var random;
(function (i) {
setTimeout(function () {
random = Math.floor(Math.random() * 6) + 1;
document.getElementById("result").innerHTML = random;
}, 50*i);
})(i);
}
}
解决方案
一种选择是diceSimulation
返回在msPromise
之后解析的 a ,并为它:50 * 31
rollDie
await
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
or代替,只要可能。)选择一次insidelet
也会更优雅,而不是在循环的每次迭代中,除非你故意插入 HTML 标记,否则最好分配改为:_result
diceSimulation
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>
推荐阅读
- php - 使用与 php mvc 嵌套的选择时出现 ajax 问题
- snowflake-cloud-data-platform - 雪花视图的性能问题
- python - 硒自动化可以与 BS4 一起使用吗?
- javascript - 如何使用以“;”分隔的 Jquery 或 javascript 添加多个电子邮件 ID 验证 “,”在文本区域
- opentok - 在 Iframe 中运行调用前测试演示
- python - 从 Django 的根目录提供静态文件
- tfs - Visual Studio tfs 多服务器添加问题
- haskell - 独立的 Haskell 可执行文件可以在具有相同操作系统的机器上运行吗?
- r - 地图函数内的对象无法识别
- sql - 为函数创建同义词