Javascript 等待setTimeout完成,然后继续执行其余代码

Javascript 等待setTimeout完成,然后继续执行其余代码,javascript,Javascript,现在调用此函数时,chatmessage首先设置为空字符串,等等。然后执行超时函数中的代码,这是核心行为。但是,有没有办法使setTimeout同步 这就是我想要的行为: 如果如果(文件)为true,则设置sendingMessage=true(sendingMessage触发纺车动画) 等待3.8秒并执行超时功能中的内容 只有这样,才能将chatmessage设置为空字符串等(代码的其余部分) 编辑1: 我可以将代码移到超时函数中,但问题是,如果文件不存在,它应该一起跳过超时函数。然后我必须编

现在调用此函数时,
chatmessage
首先设置为空字符串,等等。然后执行超时函数中的代码,这是核心行为。但是,有没有办法使setTimeout同步

这就是我想要的行为:

  • 如果
    如果(文件)
    为true,则设置
    sendingMessage=true
    (sendingMessage触发纺车动画)
  • 等待3.8秒并执行超时功能中的内容
  • 只有这样,才能将
    chatmessage
    设置为空字符串等(代码的其余部分)
  • 编辑1:
    我可以将代码移到超时函数中,但问题是,如果
    文件不存在,它应该一起跳过超时函数。然后我必须编写另一个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!文件)中再次写入相同的命令,但我只是试图避免写入重复的代码。但是我觉得我可以把它变成一个函数,并把它同时称为两个地方?你怎么认为?