Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么异步在我的情况下不起作用(NodeJS)?_Javascript_Typescript_Asynchronous_Async Await - Fatal编程技术网

Javascript 为什么异步在我的情况下不起作用(NodeJS)?

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函数同步运行,

我是async/Wait for Node的新手。我很难理解async/await是如何工作的。如果有人能告诉我学习的方向,我将不胜感激

异步函数循环(){
设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。谢谢帕特里克的介入,我不认为你太迂腐。