在javascript中,异步回调如何在单个线程中工作?

时间:2014-01-04 03:39:59

标签: javascript

对于下面的onload 2函数,它们被安排调用' onload'在这两张图片中,有什么能保证在另一张图片开始之前完全完成?在这个单线程环境中需要触发的回调幕后是否有队列?

如果entryFunction从不停止循环,它是否会暂停其线程并屈服于其中一个doWorks()?

我听说javascript不是多线程的,所以entryFunction()是否会产生/暂停这些异步函数调用?

function entryFunction() {
  var obj = new Image();
  var obj2 = new Image();
  // ...
  obj.onload = function() { dowork(); }
  obj2.onload = function() { dowork(); }

  while (1) {
    console.log("Actual work is being done");
  }
}

function dowork() {
  doThis();
  doThat();
}

4 个答案:

答案 0 :(得分:2)

您的代码不会离开while循环。因为JavaScript只有一个线程,所以每个函数都必须return将控制权返还给环境。

在您的示例中,您的示例将使您的浏览器在单独的线程中设置和下载图像(因为浏览器是多线程的)。下载图像后,环境会将对onload()的呼叫排队。这些将在您的JavaScript程序下次将控制权返回到环境时运行。

但是由于你在while循环中无限期地控制,控制永远不会返回到环境,并且排队的事件永远不会运行。

答案 1 :(得分:1)

没有任何保证。

你只能保证他们不会在同一时间跑。

while循环将阻止其他js运行。

浏览器本身不限于单个线程实现。 Javascript本身在单个运行循环中运行,但这并不能保证浏览器中的其余部分(并且它们没有)。

答案 2 :(得分:0)

我上面的两个正确答案(原始JS是单线程的,并将阻止它)。也就是说,有一个名为Web Workers的新HTML5 API将为您提供JS中的并发性。

http://www.html5rocks.com/en/tutorials/workers/basics/

它们是“真实的”(就开发人员而言)并发性。有些浏览器确实将它们实现为真正的并发性,有些浏览器会在幕后协同程序和调度程序中捏造它们。

答案 3 :(得分:0)

Javascript不是多线程的,但它是事件驱动的。

dowork()将被调用,除非onload()被某种东西调用。

除此之外,(1)不会导致代码继续前进。 而不是while(1)使用setInterval或setTimeout。这样,函数不会阻止其余的代码。

如果在new Image()

之后设置onload,onload()导致new Image()被调用,则可能出现竞争条件