使用JavaScript进行代码响应以进行大量计算

时间:2019-01-05 09:43:56

标签: javascript asynchronous promise async-await

“了解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
    // ...
});

3 个答案:

答案 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以减少执行脚本的时间。