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

Asynchronous function means no blocking, what about in javascript?

本文关键字:javascript 中呢 意味着 函数 异步      更新时间:2023-09-26

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

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

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

我误解了什么吗?

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

console.log("before async call");
setTimeout(function() { console.log("async stuff done"); }, 0);
console.log("after async call");

这将始终显示

before async call
after async call
async stuff done

但现在,如果你这样做:

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)会锁定执行。

@Joachim Isaksson:你和我都同意异步调用没有阻塞,但在javascript中,使用setTimeout函数的异步调用只是延迟阻塞,它从来没有消除阻塞。

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

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