异步函数意味着没有阻塞,那么在javascript中呢
Asynchronous function means no blocking, what about in javascript?
异步函数意味着没有阻塞,而且大多数情况下,它保留了一个回调函数。在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。它看起来像是异步的。但它只是延迟了阻塞。
相关文章:
- DIV怎么能像Javascript中的另一个元素一样工作呢
- javascript中的函数定义.但实际的区别是什么呢
- 在JavaScript中:如果Object是一个函数,那么如果一个函数是一个对象的实例,它怎么可能呢
- 在Javascript中,如果Date对象同时具有valueOf和getTime方法,那么它们为什么同时具有呢
- 我怎么能在Javascript中实现这样的多维数组呢
- 异步函数意味着没有阻塞,那么在javascript中呢
- 为什么不在JavaScript中直接使用元素id作为标识符呢?
- 在Javascript中,为什么要用split来定义数组呢?
- 我们如何在纯Javascript中实现取消呢?
- 如何在javascript中使用prototype来合并数组呢?
- 有没有理由不把JavaScript中的var替换成let呢?
- 在javascript中交换页面内容.为什么没有解决方案呢?
- 为什么我不能在javascript中使用else语句呢?
- 在javascript中使用多个数字来访问数组's元素:为什么这样做呢?
- 为什么不从JavaScript中的对象中继承/扩展呢?
- 如果我们希望PHP中的数据保存在同一个文件中,我们能做些什么来代替javascript中的ajax调用呢?
- 我怎样才能打破Javascript中的非矛盾法则呢?
- 为什么我不应该在JavaScript中为常量使用全局变量呢?
- 在javascript中,我该如何做呢?
- 为什么HTML的ID上会有额外的引号呢?在JavaScript中使用. innerhtml设置