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

6 javascript

对于下面的 onload 2 函数(计划调用这 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();
}
Run Code Online (Sandbox Code Playgroud)

Kat*_*uro 3

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

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

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