等待setTimeout完成,然后返回值Javascript
我正在做一个简单的骰子游戏,我已经设置了一个函数,可以随机生成数字并快速显示,以模拟骰子的滚动。我遇到的问题是,我想等到模拟完成后再返回值,但是值会立即返回。谁能给我指出正确的方向吗?基本上,我希望rollDie在继续之前等待Dice模拟完成等待setTimeout完成,然后返回值Javascript,javascript,html,function,delay,Javascript,Html,Function,Delay,我正在做一个简单的骰子游戏,我已经设置了一个函数,可以随机生成数字并快速显示,以模拟骰子的滚动。我遇到的问题是,我想等到模拟完成后再返回值,但是值会立即返回。谁能给我指出正确的方向吗?基本上,我希望rollDie在继续之前等待Dice模拟完成 function rollDie(){ diceSimulation(); var result = Math.floor(Math.random() * 6) + 1; document.getElementById("r
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返回一个在50*31毫秒后解析的承诺,rollDie等待它:
现场演示:
异步函数rollDie{
等待模拟;
var结果=Math.floorMath.random*6+1;
document.getElementByIdresult.innerHTML=结果;
返回结果;
}
功能模拟{
返回新PromiseSolve=>{
const result=document.getElementByIdresult;
对于设i=0;i<30;i++{
设置超时=>{
常数random=Math.floorMath.random*6+1;
result.textContent=随机;
},50*i;
}
setTimeoutresolve,1530;
};
}
滚刀;
一种选择是,diceSimulation返回一个在50*31毫秒后解析的承诺,rollDie等待它:
现场演示:
异步函数rollDie{
等待模拟;
var结果=Math.floorMath.random*6+1;
document.getElementByIdresult.innerHTML=结果;
返回结果;
}
功能模拟{
返回新PromiseSolve=>{
const result=document.getElementByIdresult;
对于设i=0;i<30;i++{
设置超时=>{
常数random=Math.floorMath.random*6+1;
result.textContent=随机;
},50*i;
}
setTimeoutresolve,1530;
};
}
滚刀;
您可以使用回调或承诺来实现预期结果。 下面的一个简单示例显示了如何使用承诺作为解决方案:
let diceSimulation = () => {
console.log("Dice simulation complete");
};
let rollDie = new Promise((resolve,reject)=> {
resolve("Roll die is completed");
})
rollDie.then((message)=> {
console.log(message);
diceSimulation();
},
(fail)=> {
})
您可以使用回调或承诺来实现预期结果。 下面的一个简单示例显示了如何使用承诺作为解决方案:
let diceSimulation = () => {
console.log("Dice simulation complete");
};
let rollDie = new Promise((resolve,reject)=> {
resolve("Roll die is completed");
})
rollDie.then((message)=> {
console.log(message);
diceSimulation();
},
(fail)=> {
})
当我运行此程序时,在显示rollDie的结果后,模拟仍会运行。它几乎就像是在显示结果之后才进行模拟。如果更改i<30或},50*i,则必须适当地更改1530数字,否则,应该在for循环中的所有超时完成后调用resolve。实际上,既然最终操作与循环操作相同,为什么不完全忽略最终操作,从0到30而不是从0到29进行迭代呢?我没有做任何更改,只是粘贴了它,它就这样做了。我看到了显示的结果,然后我看到了模拟。看起来rollDie实际上返回的是[object Promise],而不是一个数字。为了使用承诺,你必须打电话给他们。然后点击他们或等待他们,如答案所示。见编辑,似乎工作得很好,我仍然有问题。我从另一个函数调用rollDie有关系吗?我需要再做一次等待吗?当我运行这个时,在我显示了rollDie的结果之后,模拟仍然会运行。它几乎就像是在显示结果之后才进行模拟。如果更改i<30或},50*i,则必须适当地更改1530数字,否则,应该在for循环中的所有超时完成后调用resolve。实际上,既然最终操作与循环操作相同,为什么不完全忽略最终操作,从0到30而不是从0到29进行迭代呢?我没有做任何更改,只是粘贴了它,它就这样做了。我看到了显示的结果,然后我看到了模拟。看起来rollDie实际上返回的是[object Promise],而不是一个数字。为了使用承诺,你必须打电话给他们。然后点击他们或等待他们,如答案所示。见编辑,似乎工作得很好,我仍然有问题。我从另一个函数调用rollDie有关系吗?我需要再做一次等待吗?
let diceSimulation = () => {
console.log("Dice simulation complete");
};
let rollDie = new Promise((resolve,reject)=> {
resolve("Roll die is completed");
})
rollDie.then((message)=> {
console.log(message);
diceSimulation();
},
(fail)=> {
})