Javascript async是否使其内部的一切都是异步的?
据MDN称 异步函数声明定义了一个异步函数 我的理解是,该函数将被视为一个异步进程,就像Javascript async是否使其内部的一切都是异步的?,javascript,node.js,async-await,Javascript,Node.js,Async Await,据MDN称 异步函数声明定义了一个异步函数 我的理解是,该函数将被视为一个异步进程,就像setTimeout或某些数据库请求一样。例如,在下面的示例中,进程应该在数字之间的某个位置输出“main” let func2 = async () => { for (let i = 0; i < 51; i ++) { console.log(i); } } (async () => { func2(); console.log("main"
setTimeout
或某些数据库请求一样。例如,在下面的示例中,进程应该在数字之间的某个位置输出“main”
let func2 = async () => {
for (let i = 0; i < 51; i ++) {
console.log(i);
}
}
(async () => {
func2();
console.log("main");
})()
let func2=async()=>{
for(设i=0;i<51;i++){
控制台日志(i);
}
}
(异步()=>{
func2();
控制台日志(“主”);
})()
然而,“main”总是在最后得到安慰,就像整个过程是同步的一样。我理解错了什么
如果同步代码仍然是同步的,那么async
的目的是什么?只允许在其内部等待
,并提供一些奇特的方式来返回承诺
async是否使其内部的一切都是异步的
不,没有。函数中的代码仍然同步运行,并将在事件循环运行时阻止它
如果同步代码仍然是同步的,那么异步的目的是什么?只允许在里面等待,并提供一些奇特的方式来回报承诺
是的,它主要用于等待
但是,也有一些时候,它自动用承诺包装代码是有用的。例如,它会自动捕获任何抛出的异常,并将它们转换为被拒绝的承诺。有时这是有用的。有关此其他用途的示例,请参阅本文的“错误处理”部分:
但是,async
关键字的主要功能是定义一个可以使用wait
的函数。这就是ES7的设计者决定让wait
工作的方式
仅供参考,如果函数中存在等待承诺的await
,那么这将导致函数在await
点提前返回。它将在此时返回并返回一个承诺。您正在等待的操作将已启动,在等待的承诺得到解决之前,函数的其余部分将不会执行。因此,使用wait
可以使一些代码稍后执行。但是,与await
之前的代码一样,即使在await
解析后函数恢复运行,该函数中的Javascript仍然是同步和阻塞的(直到另一个await
或直到返回
)
将其包装在承诺中并检测何时使用完成。然后()
将在调用处理程序时延迟。然后()
处理程序,直到事件循环的下一个勾号。因此,.then()
将稍微延迟,因为您将其包装在承诺中,然后使用了.then()
,但代码运行的时间不会改变。它仍然是同步和阻塞的
在Javascript中,采用同步代码并使其异步的唯一方法是:
fs.readFile()
work。它们有一个立即返回的本机代码实现,然后在实现中使用本机线程,并通过回调通知完成否,异步函数中的主体在被调用时运行,但会暂停
wait
表达式。如果没有要等待的内容,该函数将像正常函数一样运行,但返回承诺的情况除外
但是,如果有等待
,则暂停执行并继续事件循环。当等待的承诺在当前事件循环完成后的某个时间解决时,它将继续它停止的地方。例如,在此处记录“main”时与您的示例进行比较
let func2=async()=>{
console.log(“开始”)
for(设i=0;i<10;i++){
如果(i==5){
等待新承诺(resolve=>setTimeout(resolve,200))
}
控制台日志(i);
}
}
(异步()=>{
func2()。然后(()=>console.log('done');
控制台日志(“主”);
})()
你是对的;添加关键字并不能神奇地使代码异步。JavaScript在技术上是同步的,因为它一次只能运行一件事情async
基本上是告诉解析器可以在以后运行该函数。当它确实运行时,这是当前运行的唯一东西“只允许在它内部等待并提供某种奇特的方式来返回承诺?”这很正常,但它非常奇特,因为它将复杂的嵌套控制语句拆分为承诺链。Javascript是单线程的,因此,即使代码是异步的,您也不会使其出错。@GetOffMyLawn我在某处看到JavaScript可以在进程之间切换,因此其行为类似于多线程。这就是为什么我认为它会在主进程和异步函数之间切换,这使得两个进程并行。感谢10.5线程的链接。首先我听说了!我也注意到了你的仅供参考的部分。我们是否可以说,一旦异步函数中存在等待,返回将是无用的?@zhangjingzhou-不,不是无用的<代码>返回将设置承诺的解析值。函数