“了解ECMASCript 6”一书中的引言:
JavaScript引擎基于单线程事件循环的概念构建。 单线程意味着一次只执行一段代码。
...
JavaScript引擎一次只能执行一段代码,因此 他们需要跟踪要运行的代码。该代码是 保持在工作队列中。每当准备好执行一段代码时, 它被添加到作业队列中。 JavaScript引擎完成后 执行代码后,事件循环将执行队列中的下一个作业。的 事件循环是JavaScript引擎中用于监控的过程 代码执行并管理作业队列。请记住, 队列,作业执行从队列中的第一个作业到最后一个作业。
这是否意味着如果作业队列中的下一段代码花费大量时间,则Web应用程序将直到完成代码才响应? “代码段”的大小是多少?它是函数体还是代码块(即{}括号内的代码)?函数主体包含其他函数调用(这是兔子洞...)。这让我感到困惑。
例如,它可以是用于Promise实例初始化的函数的巨大代码,也可以是.then((resolve,reject)=> {...}
中的巨大代码:
// ...
const p = new Promise((resolve, reject) => {
// Here is long work
// ...
});
// ...
p.then(() => {
// Or long work is here
// ...
});
答案 0 :(得分:0)
这是否意味着作业队列中的下一段代码是否占用大量 到那时Web应用程序将不会响应,直到该代码将是 完成了吗?
基本上可以,在事件循环中运行代码时,time complexity非常重要。例如,在nodejs中,不建议使用加密api的同步版本,即:
crypto.randomBytes (synchronous version)
crypto.randomFillSync
crypto.pbkdf2Sync
因为它们涉及昂贵的计算。
“代码段”的大小是多少?是函数主体还是代码块(即{}括号内的代码)?
从您的引言中,“代码段”我认为它只是指一条语句,因此单个线程一次只能执行一个语句,因此不会发生并行执行,您只能通过多个线程来实现。
旁注:比“代码的大小”更重要computational complexity。 相当大的“一段代码大小”可以在恒定时间O(1)上运行,而较小的代码段则需要花费指数时间。
更多信息here,尤其是对于Google V8 Engine。
TL; DR :计算复杂性至关重要,尤其是在单线程引擎中。对于长时间运行的计算,请在浏览器中使用Web Worker,或者在使用Node的情况下使用子进程。
答案 1 :(得分:0)
Concurrency-modeil and javascript_eventloops
好吧,我的工作是在后台执行这些庞大的操作,并首先渲染Web应用程序(执行该代码段以显示该应用程序)。
浏览以下主题:Run to completion
希望这能回答您的问题。
答案 2 :(得分:-1)
您可以为每个函数设置Interval以减少执行脚本的时间。