Javascript setTimeout正在第三次调用时覆盖我的代码

Javascript setTimeout正在第三次调用时覆盖我的代码,javascript,debugging,Javascript,Debugging,我编写了一个替换HTML字符串的函数,问题如下: function omniText(answer1, answer2, answer3, timeout) { setTimeout(function () { document.getElementById("goodAnswer").innerHTML = answer1, document.getElementById("mildAnswer").innerHTML = answer2,

我编写了一个替换HTML字符串的函数,问题如下:

function omniText(answer1, answer2, answer3, timeout) {
    setTimeout(function () {
        document.getElementById("goodAnswer").innerHTML = answer1,
        document.getElementById("mildAnswer").innerHTML = answer2,
        document.getElementById("badAnswer").innerHTML = answer3;

    }, timeout);
我用三种不同的函数调用它三次。当我第三次调用它时,我的字符串出现,但随后被前一个字符串替换

例:


玩弄超时并不是最好的做法,
Promise
可以帮助您,因为您将确切地知道什么时候做了什么或没有做什么,例如,如果您的main方法返回一个Promise

函数omniText(应答1、应答2、应答3、超时){
//让我们回报一个新的承诺
//您只需调用resolve()或reject(新错误(…)
//告诉我什么时候完成,或者有什么问题
返回新承诺(功能(解决、拒绝){
//你的主代码
setTimeout(函数(){
document.getElementById(“goodAnswer”).innerHTML=answer1,
document.getElementById(“mildAnswer”).innerHTML=answer2,
document.getElementById(“badAnswer”).innerHTML=答案;
//我们完成了,所以让我们调用resolve()
解决();
},超时);
})
}
如果您需要中间人电话,只需返回即可

函数show123(){
返回omniText(“123”,“1500”)
}
函数showHello(){
返回omniText(“您好”,“你好”,“4500”)
}
函数showBye(){
返回omniText(“再见”,“再见”,“2500”)
}
要么像意大利面一样打电话

(函数(){
show123()
.then(函数(){return showholl();})
.then(函数(){return showBye();})
})()
或者使用
async/await

(异步()=>{
等待展示123()
等待showHello()
等待再见
})()

工作示例:

//主函数
常量omniText=(应答1、应答2、应答3、超时)=>
新承诺((解决、拒绝)=>{
setTimeout(函数(){
控制台日志(应答1)
解决()
},超时)
});
//中间通话
const show123=()=>omniText(“123”,“1500”);
const showHello=()=>omniText(“Hello”、“Hello”、“4500”);
const showBye=()=>omniText(“Bye”、“Bye”、“2500”);
//结果
(异步()=>{
console.log('START');
等待展示123();
等待showHello();
等待再见();
console.log('END');

})()
他们按照超时的顺序显示字符串
4500
2500
之后运行并覆盖它。您期望的结果是什么?您是否希望
showHello()
超时在
show123()
超时完成后启动?@Barmar我还有一个带计时器的函数。基本上,当我使用打字机脚本时,一个函数等待另一个函数响应。让函数返回一个承诺,该承诺在超时完成时解决,然后在其
中调用下一个函数。然后()
//will show 123 in html page
function show123() {
  omniText("123", "", "", 1500)
}
show123();

//will show Hello in html page
function showHello() {
  omniText("Hello", "", "", 4500)
}
showHello();

//will show Bye but then will show 123
function showBye() {
  omniText("Bye", "", "", 2500)
}
showBye();