Javascript 为什么异步在我的情况下不起作用(NodeJS)?
我是async/Wait for Node的新手。我很难理解async/await是如何工作的。如果有人能告诉我学习的方向,我将不胜感激Javascript 为什么异步在我的情况下不起作用(NodeJS)?,javascript,typescript,asynchronous,async-await,Javascript,Typescript,Asynchronous,Async Await,我是async/Wait for Node的新手。我很难理解async/await是如何工作的。如果有人能告诉我学习的方向,我将不胜感激 异步函数循环(){ 设i=0; 而(i{ 设置超时(()=>{ 解决('步骤2') }, 1000) }) } 异步函数循环(){ 常量结果=等待超时() console.log(结果) } console.log(“步骤1”); loop(); console.log(“步骤3”)如果希望循环异步循环,请让它在循环中执行异步操作。async函数同步运行,
异步函数循环(){
设i=0;
而(i<10000){
i++;
}
console.log(“步骤2”);
}
console.log(“步骤1”);
loop();
console.log(“步骤3”);
按顺序应为:“步骤1”、“步骤3”、“步骤2”,但它正在打印“步骤1”、“步骤2”、“步骤3”,就好像它是同步的一样。异步函数立即执行,只有在到达第一个
wait
语句时才会“暂停”
为此目的使用异步函数并没有多大意义。如果您的目标只是稍微晚一点执行某些操作,则可能需要
过程。nextTick
它按该顺序显示消息,因为没有触发异步操作。而循环是同步执行的。
试着这样做:
函数超时(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
解决('步骤2')
}, 1000)
})
}
异步函数循环(){
常量结果=等待超时()
console.log(结果)
}
console.log(“步骤1”);
loop();
console.log(“步骤3”)
如果希望循环
异步循环,请让它在循环中执行异步操作。async
函数同步运行,直到第一个wait
(或当它返回时)为止,此时它返回一个完成的承诺
异步循环有时被很好地建模为异步生成器函数:
函数somethingsync(值){
返回新承诺(解决=>{
设置超时(()=>{
决心(价值);
},Math.random()*50);
});
}
异步函数*loop(){
设i=0;
而(i<10){//将其改为10而不是10000
产生一些同步(i++);
}
console.log(“步骤2”);
}
console.log(“步骤1”);
const gen=loop();
console.log(“步骤3”);
(异步()=>{
用于等待(gen的常量值){
console.log(值);
}
})();代码>它是同步的,在函数中没有任何异步或被等待的内容。。。async
函数中没有任何异步内容是没有意义的。async
不会导致函数在另一个线程中运行。JavaScript是单线程的,因此没有任何异步等待,函数仍然同步运行。您可能会将“异步”与“多线程”混淆。@trincot在向不返回承诺的内容添加wait
时,这不是语法错误,也不会使内容异步await i++
是同步的,因此与i++
(没有wait)完全相同@slebetman,然后您会惊讶地发现“步骤3”是在“步骤2”之前输出的wait
总是挂起它所在的函数的执行,该函数会立即返回一个承诺。或者,您可以将创建承诺简化为promise.resolve()
很抱歉给人留下迂腐的印象,我真的没有想把它变成一个论点,我只是想澄清值得注意的评论中可能存在的歧义,这样未来的读者就不会误解这个断言的含义。我确实认为return
在async
函数中的工作方式确实值得注意,但是PATRIKROBETS——我想,因为它总是返回一个承诺,你可以认为函数的代码本身是同步的,包括<代码>返回<代码>,如果它在第一个代码>之前达到一个>等待< /代码>。我的观点是,一个async
函数如果没有await
,仍然会返回一个承诺,并且您只能异步地获得该结果。我应该说“当它返回”而不是return
(因为,正如你所说,最终是同步执行的),但这只是评论中的一个小观察。是的,这是正确的@T.J.Crowder。谢谢帕特里克的介入,我不认为你太迂腐。