Javascript 在多个settimeout上使用Async/Await
为了理解async/await,我试图在settimeout运行并过期后显示一条控制台消息。如何修复下面的代码?我有5个settimeout函数,每一个都应该在完成后显示各自的消息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”) },
函数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—希望这对您有所帮助