Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步函数意味着没有阻塞,在javascript中呢?_Javascript_Jquery_Multithreading_Node.js_Asynchronous - Fatal编程技术网

异步函数意味着没有阻塞,在javascript中呢?

异步函数意味着没有阻塞,在javascript中呢?,javascript,jquery,multithreading,node.js,asynchronous,Javascript,Jquery,Multithreading,Node.js,Asynchronous,异步函数意味着没有阻塞,而且大部分情况下,它与回调函数保持一致。 在c和java中,异步调用函数时,必须涉及多个线程。因此,线程并行地执行任务,异步方法完成后将调用回调函数 像javascript这样的语言是单线程的。那么它是如何实现异步功能的呢 我读过一些文章,我知道需要使用事件循环和setTimeout函数来进行回调。但这就是所谓的异步吗?因为我认为它不会移除阻塞,因为它是单线程的。 我知道ajax是真正异步的,因为它使用浏览器支持的另一个线程 我误解了什么吗?@Joachim Isakss

异步函数意味着没有阻塞,而且大部分情况下,它与回调函数保持一致。 在c和java中,异步调用函数时,必须涉及多个线程。因此,线程并行地执行任务,异步方法完成后将调用回调函数

像javascript这样的语言是单线程的。那么它是如何实现异步功能的呢

我读过一些文章,我知道需要使用事件循环和setTimeout函数来进行回调。但这就是所谓的异步吗?因为我认为它不会移除阻塞,因为它是单线程的。 我知道ajax是真正异步的,因为它使用浏览器支持的另一个线程


我误解了什么吗?

@Joachim Isaksson:你和我都同意异步调用不是阻塞,但在javascript中,使用setTimeout函数的异步调用只是延迟阻塞,它永远不会移除阻塞

function f1(callback){
    setTimeout(function () {
      // f1's logic
      callback();
    }, 1000);
  }

  f1(f2);
作为代码,f1的逻辑将被延迟,当f1完成时,它将回调f2。它看起来像是异步的。但它只是延迟了阻塞

Javascript在一个线程中同步运行,但所有I/O操作都是异步的,这意味着调用是非阻塞的,当完成时,回调不会中断正在运行的代码,而是在当前代码完成后同步运行。因此,它不会延迟阻塞。 以下是一个例子:

console.log("before async call");
setTimeout(function() { console.log("async stuff done"); }, 0);
console.log("after async call");
这将始终显示

但现在,如果你这样做:

console.log("before async call");
setTimeout(function() { console.log("async stuff done"); }, 0);
console.log("after async call");
while (true) {
  // Do nothing
}
这将只显示:

before async call
after async call

async stuff done永远不会显示,因为while true会锁定执行。

Java和C中的异步调用并不一定意味着涉及另一个线程,只是调用设置了一种方法,可以继续执行回调函数,并在操作(例如磁盘读取)完成时尽快返回以执行其他工作。没有阻塞延迟,因为回调不会中断正在运行的代码。看我的答案。我大部分同意你说的。但是我认为setTimeout中的函数是一个块,所以在c或java中,这个块可以在另一个线程中并行运行。但是在javascript中,这个块仍然在单个线程中运行。我们都知道这个函数被附加到事件队列中,我们不确定它运行的确切时间,但我们确定它会在某个时候运行。所以我认为这个块被延迟了。
before async call
after async call