Javascript 在多个settimeout上使用Async/Await

Javascript 在多个settimeout上使用Async/Await,javascript,async-await,Javascript,Async Await,为了理解async/await,我试图在settimeout运行并过期后显示一条控制台消息。如何修复下面的代码?我有5个settimeout函数,每一个都应该在完成后显示各自的消息 函数t1(){ 设置超时(()=>{ 控制台日志(“1”) }, 1000); } 函数t2(){ 设置超时(()=>{ 控制台日志(“2”) }, 2000); } 函数t3(){ 设置超时(()=>{ 控制台日志(“3”) }, 3000); } 函数t4(){ 设置超时(()=>{ 控制台日志(“4”) },

为了理解async/await,我试图在settimeout运行并过期后显示一条控制台消息。如何修复下面的代码?我有5个settimeout函数,每一个都应该在完成后显示各自的消息

函数t1(){
设置超时(()=>{
控制台日志(“1”)
}, 1000);
}
函数t2(){
设置超时(()=>{
控制台日志(“2”)
}, 2000);
}
函数t3(){
设置超时(()=>{
控制台日志(“3”)
}, 3000);
}
函数t4(){
设置超时(()=>{
控制台日志(“4”)
}, 4000);
}
函数t5(){
设置超时(()=>{
控制台日志(“5”)
}, 5000);
}
异步函数main(){
等待t1();
控制台日志(“1秒完成”);
等待t2();
console.log(“2秒完成”);
等待t3();
控制台日志(“3秒完成”);
等待t4();
控制台日志(“4秒完成”);
等待t5();
log(“耶!我都做完了”);
}
main()您应该使用

函数t1(){
返回新承诺(功能(解决、拒绝){
设置超时(()=>{
控制台日志(“1”);
解决();
}, 1000);
});
}
函数t2(){
返回新承诺(功能(解决、拒绝){
设置超时(()=>{
控制台日志(“2”);
解决();
}, 1000);
});
}
函数t3(){
返回新承诺(功能(解决、拒绝){
设置超时(()=>{
控制台日志(“3”);
解决();
}, 1000);
});
}
函数t4(){
返回新承诺(功能(解决、拒绝){
设置超时(()=>{
控制台日志(“4”);
解决();
}, 1000);
});
}
函数t5(){
返回新承诺(功能(解决、拒绝){
设置超时(()=>{
控制台日志(“5”);
解决();
}, 1000);
});
}
异步函数main(){
等待t1();
控制台日志(“1秒完成”);
等待t2();
console.log(“2秒完成”);
等待t3();
控制台日志(“3秒完成”);
等待t4();
控制台日志(“4秒完成”);
等待t5();
log(“耶!我都做完了”);
}

main()您犯了两个错误

  • 首先,在调用函数之前使用
    wait
    t1、t2、t3…
    <代码>等待
应用于承诺
  • 您正在将
    10002000,…
    传递到
    setTimeout()
    。您应该创建一个函数,该函数返回一个
    承诺
    ,该承诺将在1秒后解析
  • 在该函数返回承诺之前使用
    wait
  • let afterOne=(num)=>新承诺(res=>{
    设置超时(()=>{
    //记录1000毫秒后传递给函数的数字
    console.log(num);
    //解析当前承诺,以便可以设置下一个setTimeout
    res();
    },1000)
    })
    异步函数main(){
    /*此循环的作用与
    等待后一(0);
    一等一(1);
    待会儿(2)
    待会儿(3);
    等一等(4);
    */
    
    对于(设i=0;i对于
    t1()
    t5()
    的每个函数,您需要确保这些函数返回一个
    Promise
    ,以便在内部相应的
    setTimeout()
    计时器完成后,“解析”返回的承诺

    通过以这种方式返回
    Promise
    对象,您的
    t1()
    ->
    t5()
    函数将有效地变为
    async
    方法,这反过来意味着
    wait
    前缀将导致执行
    main()
    阻塞,直到每个
    t1()
    ->
    t5()
    函数完成(或“已解决”)

    为了说明这一点,请考虑下面的代码,其中一个通用的代码> DELAYE()/Cux>函数替换了原始代码中<<代码> T1()/代码> ->代码> T5()/<代码>函数:

    /*我定义了一个通用延迟函数作为替换
    对于t1-t5功能,最大限度地减少代码量*/
    功能延迟(秒){
    /*返回将导致错误的承诺对象
    等待以阻止main()异步函数的执行
    直到这个承诺得到解决*/
    返回(新承诺((解决)=>{
    /*在承诺之内,设定你的时间*/
    设置超时(()=>{
    console.log(秒)
    /*超时完成后,调用resolve(),它
    解析此承诺并允许main()异步
    函数的执行将继续*/
    解决()
    },秒*1000);
    }))
    }
    异步函数main(){
    等待延迟(1);
    控制台日志(“1秒完成”);
    等待延迟(2);
    console.log(“2秒完成”);
    等待延迟(3);
    控制台日志(“3秒完成”);
    等待延迟(4);
    控制台日志(“4秒完成”);
    等待延迟(5);
    log(“耶!我都做完了”);
    }
    
    main();
    async wait用于承诺。我已经读到,将async放在函数之前将使其返回承诺。因此,如果我将那些t1-t5函数声明为
    async function t1(){…}
    ,它会有什么不同,因为它也会返回承诺吗?将
    async
    放在函数声明之前不会导致该函数自动按照您希望的方式运行。这样做基本上意味着您可以在从insi调用其他异步函数时使用
    wait
    关键字例如,
    t1()
    函数的de—希望这对您有所帮助