Javascript 等待setTimeout完成,然后继续执行其余代码
现在调用此函数时,Javascript 等待setTimeout完成,然后继续执行其余代码,javascript,Javascript,现在调用此函数时,chatmessage首先设置为空字符串,等等。然后执行超时函数中的代码,这是核心行为。但是,有没有办法使setTimeout同步 这就是我想要的行为: 如果如果(文件)为true,则设置sendingMessage=true(sendingMessage触发纺车动画) 等待3.8秒并执行超时功能中的内容 只有这样,才能将chatmessage设置为空字符串等(代码的其余部分) 编辑1: 我可以将代码移到超时函数中,但问题是,如果文件不存在,它应该一起跳过超时函数。然后我必须编
chatmessage
首先设置为空字符串,等等。然后执行超时函数中的代码,这是核心行为。但是,有没有办法使setTimeout同步
这就是我想要的行为:
如果(文件)
为true,则设置sendingMessage=true
(sendingMessage触发纺车动画)chatmessage
设置为空字符串等(代码的其余部分)我可以将代码移到超时函数中,但问题是,如果
文件不存在,它应该一起跳过超时函数。然后我必须编写另一个if块来检查文件是否不存在以执行相同的命令(重复代码)。解决这个问题的另一种方法是将相同的代码放在一个函数中,并在两个位置调用它,但感觉这不是一种理想的方法,创建一个函数来更改三个变量的值似乎有些过分。您可以使用承诺
在执行代码之前等待3秒钟
为此,创建一个函数,该函数返回一个承诺,并在3秒后解析
function sendMessage(){
...
if(file){
sendingMessage = true;
setTimeout(() => {
sendingMessage = false;
messages = [...messages, chatmessage];
}, 3800)
}
chatmessage = '';
inputRef.focus()
updateScroll();
}
然后在sendMessage
函数中,调用此函数,输入您要等待的秒数。当此wait
函数返回的承诺解析时,执行等待时间结束后要执行的代码
下面的代码显示了如何在sendMessage
函数中调用wait
函数的示例
function wait(seconds) {
return new Promise(resolve => {
setTimeout(resolve, seconds * 1000);
});
}
async function sendMessage() {
...
if(file){
sendingMessage = true;
await wait(3); // wait for 3 seconds
sendingMessage = false;
messages = [...messages, chatmessage];
}
chatmessage = '';
inputRef.focus()
updateScroll();
}
你可以在这里使用promise,你的例子太复杂了,所以我将展示更小的
功能睡眠(时间){
返回新承诺(resolve=>setTimeout(resolve,time));
}
异步函数run(){
控制台日志(1);
等待睡眠(1000);
控制台日志(2);
}
run()代码>您不能直接实现这一点。您必须将超时函数包装成承诺,并在异步函数中等待结果
function wait(seconds) {
return new Promise(resolve => {
setTimeout(resolve, seconds * 1000);
});
}
async function sendMessage() {
...
if(file){
sendingMessage = true;
await wait(3); // wait for 3 seconds
sendingMessage = false;
messages = [...messages, chatmessage];
}
chatmessage = '';
inputRef.focus()
updateScroll();
}
这是一把小提琴:
Uhm,只需将命令移到setTimeOut的回调函数中即可。这是否回答了您的问题?const promise1=新承诺((解析,拒绝)=>{setTimeout(()=>{resolve('foo');},300);});promise1.then((value)=>{console.log(value);//预期输出:“foo”})@是的,这是可行的,但问题是如果文件不存在,它应该跳过超时函数并继续执行其余的。如果我在timeout函数中移动命令,那么我必须在另一个If块(If!文件)中再次写入相同的命令,但我只是试图避免写入重复的代码。但是我觉得我可以把它变成一个函数,并把它同时称为两个地方?你怎么认为?