是不是真的异步,非阻塞javascript不可能?

时间:2011-03-25 15:03:23

标签: javascript asynchronous settimeout nonblocking

那么,我在这里错过了什么吗?

流行的现代浏览器中的所有 javascript引擎(截至2011年)都是 单线程

这意味着当EVENTS可以异步发生时,它们仍然排队(在“单个文件中”)以便执行。

这意味着所有这些将外部javascript加载到HTML页面的技术,它们实际上只是允许下载异步发生,但是下载代码的执行总是发生一次(函数) )一次一个文件。

所以我在网上看到的其他“提示”分解并使用setTimeout执行初始化代码块,这将是伪造的,错误的建议 - 定时器也是单文件队列并且只按顺序执行。使用setTimeout,您只是通过计时器导致无序执行,并允许浏览器中的其他事件(即鼠标点击或按键等)跳入队列 - 这本身可能很好,但是它肯定不是异步代码执行。

如果我是对的,那里有一堆很糟糕的,被误解的建议经常重演。

7 个答案:

答案 0 :(得分:15)

你不是在混淆同步性的异步性吗?确实,浏览器JS环境中没有任何并发(除了Web worker,以及浏览器内部执行的任何操作,如I / O和渲染),但 asynchronicity 只是意味着所有调用都是非阻塞的,控制流总是立即返回。

您对“阻止”/“非阻止”的定义也不清楚。阻塞函数调用的广泛含义是,在完成所有计算,I / O等操作之前,它不会将控制权返回给调用者。这并没有说明并发性。

答案 1 :(得分:2)

AFAIK,Javascript在某种意义上是异步的,尽管它在一个线程上运行,但所述线程并行运行到其他执行其他操作(例如页面呈现)的线程,而与Javascript引擎无关。

我认为,这个定义并不意味着Javacsript本身可以按任何顺序执行 - 这是线性的,并且符合范围。

答案 2 :(得分:1)

关于JavaScript引擎在单个页面中的工作方式你是对的,w / r / t setTimeout等等。 (一般来说,这是一件好事,因为它使得编写JavaScript和推理代码变得更加容易。)如果你还没有读过它,jQuery的Jon Resig写了solid explanation of JavaScript's timers

浏览器中的真正异步JavaScript 由Web Workers API定义。

答案 3 :(得分:0)

将新的HTML5“网络工作者”工具放在一边,你是对的。

答案 4 :(得分:0)

Web workers就是为了这个。虽然由于浏览器可用性差,但它们现在可能不是解决方案。

答案 5 :(得分:0)

我不是javascript大师,所以这只是我的冥想,但在我看来你可能部分正确。

但是,如果您将Javascript线程视为“时间”并允许其他函数在您需要的任何地方跳过时间流,那么它会使javascript基本上像非阻塞进程。

另一方面,HTML 5定义了Web工作者,如果我正确地理解它,则是“多线程”,在许多人可以同时处理的意义上。

答案 6 :(得分:0)

单线程是,但不排除异步。异步处理和线程处理完全不同。事实上,鼠标点击和按键通常是ppl用setTimeout完成的唯一事情。让Gui有时间在数字运算中进行交互。