正在使用 async
和 await
粗人的线?
很多个月前,我学会了如何在 Android 上编写多线程 Java 代码。我记得我必须创建线程、启动线程等。
现在我正在学习 Javascript,我刚刚了解了 async
和 await
.
例如:
async function isThisLikeTwoThreads() {
const a = slowFunction();
const b = fastFunction();
console.log(await a, await b);
}
这看起来比我以前做的简单得多,而且更直观。slowFunction()
将首先开始,然后 fastFunction()
将开始,console.log()
将等到两个函数都解决后再记录 - 和 slowFunction()
和 fastFunction()
可能同时运行。我希望它们最终在浏览器上,无论这些线程是否是单独的线程。但它看起来像粗略的多线程一样走路和说话。是吗?
最佳答案
Is using
async
andawait
the crude person's threads?
一点都不。它只是语法糖(非常非常有用的糖)而不是使用 promise ,而这又只是使用回调的一种(非常非常有用的)形式化方式。它很有用,因为您可以异步等待(不阻塞 JavaScript 主线程)本质上是异步的(如 HTTP 请求)。
如果需要使用线程,请使用 web workers , Node.js worker threads ,或您的环境提供的任何多线程。根据规范(现在),一次只允许一个线程在给定的 JavaScript“领域”内工作(非常松散:您的代码运行的全局环境及其关联对象等),因此只有一个线程一次可以访问该领域内的变量等,但线程可以通过消息传递(包括在它们之间传输对象而不复制)和shared memory进行合作.
For example:
async function isThisLikeTwoThreads() { const a = slowFunction(); const b = fastFunction(); console.log(await a, await b); }
以下是该代码在
isThisLikeTwoThreads
时的作用叫做:slowFunction
被称为 同步并将其返回值赋给a
. fastFunction
被称为 同步并将其返回值赋给b
. isThisLikeTwoThreads
达到await a
, 它包裹 a
在一个 promise 中(就像你做了 Promise.resolve(a)
)并返回一个新的 promise (不是同一个)。让我们将 promise 称为 a
“aPromise
”和函数“functionPromise
”返回的 promise 。 aPromise
解决,如果被拒绝 functionPromise
以相同的拒绝原因被拒绝,并跳过以下步骤;如果满足,则下一步完成isThisLikeTwoThreads
中的代码继续包装b
在一个 promise ( bPromise
)中等待它解决 bPromise
解决,如果被拒绝 functionPromise
以相同的拒绝理由被拒绝;如果满足,isThisLikeTwoThreads
中的代码继续记录 aPromise
的履行值和 bPromise
然后履行functionPromise
值为 undefined
上述所有工作都是在调用
isThisLikeTwoThreads
的 JavaScript 线程上完成的。已经完成,但它分布在多个“作业”中(JavaScript 术语;HTML 规范称它们为“任务”并指定 a fair bit of detail 以了解它们在浏览器上的处理方式)。如果 slowFunction
或 fastFunction
启动一个异步进程并为此返回一个 promise ,该异步进程(例如,浏览器执行的 HTTP 调用)可能在 JavaScript 线程正在执行其他操作或(如果它也是 JavaScript 代码)的同时继续与 JavaScript 线程并行在主线程上)可能已经竞争了 JavaScript 线程上的其他工作(通过将作业添加到作业队列并在循环中处理它们的线程来竞争)。但是使用 Promise 不会增加线程。 :-)
关于javascript - Javascript async 和 await 是否等同于多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153400/