Javascript async是否使其内部的一切都是异步的?

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"

据MDN称

异步函数声明定义了一个异步函数

我的理解是,该函数将被视为一个异步进程,就像
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中,采用同步代码并使其异步的唯一方法是:

  • 在另一个进程中运行它并使用进程间通信将结果传回

  • 在本机代码加载项中重写代码,该加载项使用本机线程或其他一些操作系统异步接口来完成实际工作,然后从加载项向Javascript提供异步接口(通常是通过回调返回承诺或通知完成的接口)。这是node.js异步函数,例如
    fs.readFile()
    work。它们有一个立即返回的本机代码实现,然后在实现中使用本机线程,并通过回调通知完成

  • 使用一些node.js加载项来为您完成一些任务。有些加载项声称提供线程

  • 在node version 10.5+中使用node.js线程,并按照其要求的限制进行编程。以下是一篇关于这个主题的文章:


  • 否,异步函数中的主体在被调用时运行,但会暂停
    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-不,不是无用的<代码>返回将设置承诺的解析值。函数