正在使用async
和wait
原始人的线程吗?
许多月前,我学会了如何在Android上编写多线程Java代码。我记得我必须创建线程、启动线程等等。
现在我正在学习Javascript,我刚刚学习了async
和wait
。
例如:
async function isThisLikeTwoThreads() {
const a = slowFunction();
const b = fastFunction();
console.log(await a, await b);
}
这看起来比我以前做的简单多了,而且更直观。
将首先启动,然后启动快速函数(),然后console.log()
将等待,直到两个函数在日志记录之前解决-和慢函数()
和快速函数()
可能同时运行。我希望这最终取决于浏览器是否是独立的线程。但看起来它走路和说话就像粗糙的多线程。是吗?
相似但不相同。Javascript一次只能做一件事。它基本上是单线程的。这就是说,它可能看起来很奇怪,因为结果可能以不同的顺序出现——异步和等待等函数加剧了这种情况。
例如,即使您以70fps的速度渲染后台进程,也会在渲染逻辑中出现一些小的间隙,这些间隙可用于完成promise或接收事件通知——正是在这些时刻,promise完成了,产生了多线程的错觉。
如果确实要锁定浏览器,请尝试以下操作:
let a = 1;
while (a == 1){
console.log("doing a thing");
}
你永远不会让html" target="_blank">javascript再次工作,chrome或其他任何东西会毁掉你的脚本。原因是当它进入该循环时——没有任何东西会再次触及它,不会呈现任何事件,也不会传递任何promise——因此,单线程。
如果这是一个真正的多线程环境,您可以通过将变量更改为新值从外部中断该循环。
我建议您阅读本文,了解答案是否定的: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
。当a
promise和b
promise已解决时,将其余代码排队(console.log(等待a,等待b)
)。控制台。日志
在返回IsthislikeTworthreads
后,以及可能的排队回调返回后,在同一线程中运行。假设slowFunction
和fastFunction
都是返回promise,这相当于:
function isThisLikeTwoThreads() {
const a = slowFunction();
const b = fastFunction();
a.then(aResult => b.then(bResult => console.log(aResult, bResult)));
}
正在使用async
和wait
原始人的线程吗?
不,一点也不。这只是语法糖(非常非常有用的糖)而不是使用promise,这反过来只是使用回调的一种(非常非常有用的)形式化方式。这很有用,因为您可以异步等待(不阻塞JavaScript主线程)本质上是异步的东西(如HTTP请求)。
如果需要使用线程,请使用web workers节点。js工作线程,或您的环境提供的任何多线程。根据规范(现在),一次只允许一个线程在给定的JavaScript“领域”(非常松散:代码运行的全局环境及其关联对象等)内工作,因此一次只有一个线程可以访问该领域内的变量等,但线程可以通过消息传递进行协作(包括在它们之间传输对象而不制作副本)和共享内存。
例如:
async function isThisLikeTwoThreads() {
const a = slowFunction();
const b = fastFunction();
console.log(await a, await b);
}
以下是调用IsthislikeTworthreads
时该代码所做的操作:
slowFunction
,并将其返回值分配给a
上面的所有工作都是在JavaScript线程上完成的,在该线程中调用了IsthislikeTowthreads
,但它分布在多个“作业”(JavaScript术语;HTML规范称它们为“任务”,并详细说明了在浏览器上如何处理它们)。如果slowFunction
或fastFunction
启动了一个异步进程并返回了一个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上下文中运行)。 在其核心中,它严重依赖于每个线程缓存上下文信息(例如活动用户的整个权限方案)的静态对象。 现在,我的问题是当在方法中使用时,延续可能发生在与以前不