当前位置: 首页 > 知识库问答 >
问题:

是Javascript异步和等待相当于多线程?

傅胡媚
2023-03-14

正在使用asyncwait原始人的线程吗?

许多月前,我学会了如何在Android上编写多线程Java代码。我记得我必须创建线程、启动线程等等。

现在我正在学习Javascript,我刚刚学习了asyncwait

例如:

async function isThisLikeTwoThreads() {
 const a = slowFunction();
 const b = fastFunction();
 console.log(await a, await b);
}

这看起来比我以前做的简单多了,而且更直观。

将首先启动,然后启动快速函数(),然后console.log()将等待,直到两个函数在日志记录之前解决-和慢函数()快速函数()可能同时运行。我希望这最终取决于浏览器是否是独立的线程。但看起来它走路和说话就像粗糙的多线程。是吗?

共有3个答案

司马德水
2023-03-14

相似但不相同。Javascript一次只能做一件事。它基本上是单线程的。这就是说,它可能看起来很奇怪,因为结果可能以不同的顺序出现——异步和等待等函数加剧了这种情况。

例如,即使您以70fps的速度渲染后台进程,也会在渲染逻辑中出现一些小的间隙,这些间隙可用于完成promise或接收事件通知——正是在这些时刻,promise完成了,产生了多线程的错觉。

如果确实要锁定浏览器,请尝试以下操作:

let a = 1;

while (a == 1){
    console.log("doing a thing");
}

你永远不会让html" target="_blank">javascript再次工作,chrome或其他任何东西会毁掉你的脚本。原因是当它进入该循环时——没有任何东西会再次触及它,不会呈现任何事件,也不会传递任何promise——因此,单线程。

如果这是一个真正的多线程环境,您可以通过将变量更改为新值从外部中断该循环。

史旺
2023-03-14

我建议您阅读本文,了解答案是否定的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

总之,运行时使用多个线程进行内部操作(网络,磁盘...对于Node.js环境,渲染,indexedDB,网络...对于浏览器环境),但是您编写的JavaScript代码和您从不同库导入的代码总是在单个线程中执行。异步操作将触发回调,回调将被排队并一个接一个地执行。

基本上执行这个函数时会发生什么:

async function isThisLikeTwoThreads() {
 const a = slowFunction();
 const b = fastFunction();
 console.log(await a, await b);
}

执行slowFunction。执行fastFunction。当apromise和bpromise已解决时,将其余代码排队(console.log(等待a,等待b))。控制台。日志在返回IsthislikeTworthreads后,以及可能的排队回调返回后,在同一线程中运行。假设slowFunctionfastFunction都是返回promise,这相当于:

function isThisLikeTwoThreads() {
 const a = slowFunction();
 const b = fastFunction();
 a.then(aResult => b.then(bResult => console.log(aResult, bResult)));
}
慕容星晖
2023-03-14

正在使用asyncwait原始人的线程吗?

不,一点也不。这只是语法糖(非常非常有用的糖)而不是使用promise,这反过来只是使用回调的一种(非常非常有用的)形式化方式。这很有用,因为您可以异步等待(不阻塞JavaScript主线程)本质上是异步的东西(如HTTP请求)。

如果需要使用线程,请使用web workers节点。js工作线程,或您的环境提供的任何多线程。根据规范(现在),一次只允许一个线程在给定的JavaScript“领域”(非常松散:代码运行的全局环境及其关联对象等)内工作,因此一次只有一个线程可以访问该领域内的变量等,但线程可以通过消息传递进行协作(包括在它们之间传输对象而不制作副本)和共享内存。

例如:

async function isThisLikeTwoThreads() {
 const a = slowFunction();
 const b = fastFunction();
 console.log(await a, await b);
}

以下是调用IsthislikeTworthreads时该代码所做的操作:

  1. 同步调用slowFunction,并将其返回值分配给a

上面的所有工作都是在JavaScript线程上完成的,在该线程中调用了IsthislikeTowthreads,但它分布在多个“作业”(JavaScript术语;HTML规范称它们为“任务”,并详细说明了在浏览器上如何处理它们)。如果slowFunctionfastFunction启动了一个异步进程并返回了一个promise,则该异步进程(例如,浏览器执行的HTTP调用)可能在JavaScript线程执行其他操作或任务时与JavaScript线程并行运行(如果它也是主线程上的JavaScript代码)可能与JavaScript线程上的其他工作竞争(竞争方式是将作业添加到作业队列,线程在循环中处理作业)。

但是使用promise不会增加线程。:-)

 类似资料:
  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 本文向大家介绍JavaScript 异步等待循环,包括了JavaScript 异步等待循环的使用技巧和注意事项,需要的朋友参考一下 示例 在循环中使用异步等待时,您可能会遇到其中一些问题。 如果您只是尝试在内部使用await forEach,则会抛出Unexpected token错误。 这是因为您错误地将箭头功能视为一个块。该await会在回调函数,这是不是上下文async。 解释器可以防止我们

  • 我正在尝试做一个简单的应用程序,加载数据并对其执行一个操作.所以我的想法是做这个异步。 我有3个数据源,我想异步加载它们。例如data1.xml、data2.xml和data3.xml所有文件加载起来都相当大,所以需要一些时间(这就是为什么我想要异步的原因)。 例如,我创建了一个包含3个文本框的窗口,这些文本框都绑定到一个特定的属性(Text1、Text2、Text3)和一个按钮。当我点击按钮时,

  • 问题内容: 我是一名普通的C#开发人员,但有时我会使用Java开发应用程序。我想知道是否有Java等效于C#async / await?简单来说,java相当于什么: 问题答案: 不,在Java中-甚至在v5之前的C#中,都没有等效的异步/等待方式。 在后台构建状态机是一项相当复杂的语言功能。 Java中对异步/并发的 语言 支持相对较少,但是该软件包包含许多与此相关的有用 类 。(不完全等同于任

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我正在为一个大型应用程序编写自动化测试。这些测试中的一些很容易成为<code>异步,它只提供<code>async 测试应用程序的一些关键方面如下: 这是一个巨大的ASP.NET应用程序(尽管代码在通过单元测试执行时没有在ASP.NET上下文中运行)。 在其核心中,它严重依赖于每个线程缓存上下文信息(例如活动用户的整个权限方案)的静态对象。 现在,我的问题是当在方法中使用时,延续可能发生在与以前不