使用回调时,Javascript代码如何变得异步?


26

我一直在做很多在线阅读,试图弄清楚如何编写异步JavaScript代码。我的研究中出现的很多技术之一就是使用回调。当我了解如何编写和执行回调函数的过程时,我感到困惑的是,为什么回调似乎自动地使JavaScript执行异步。所以,我的问题是:在我的JavaScript代码中添加回调函数如何使所说的代码自动地异步?


2
您可能对阅读由John Resig编写的浏览器如何在单个线程中实现此目标感兴趣:ejohn.org/blog/how-javascript-timers-work
Jalayn

@贾琳 谢谢。阅读了几个答案后,您的评论就大为不同了。
kushalvm

Answers:


26

没有。仅接受回调或传递回调并不意味着它是异步的。

例如,该.forEach函数接受回调,但是是同步的。

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

setTimeout采用了回调也是一样,是异步的。

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

挂钩到Javascript中的任何异步事件总是需要一个回调,但这并不意味着调用函数或传递它们总是异步的。


2
@SteveEvers我想您可以编辑MDN文章。回调是javascript中非常常见的术语,它表示传递给另一个函数的任何函数,该函数使用给定的函数进行回调...为什么使它复杂化?编辑:规格中
Esailija

3
@SteveEvers“回调暗示异步”是C#/ Microsoft特有的。en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija

1
@MikeBrown我想我对他的个人资料读得太多, -最受欢迎的答案肯定是一个想法,即“回调意味着异步”。
Esailija

1
但是话说@SteveEvers也是错误的。回调并不意味着异步,只是其他人将负责“回调”。
迈克尔·布朗

1
+1是因为史蒂夫·埃弗斯(Steve Evers)错了
slebetman

23

“魔术”的秘密在于,您将回调分配给的事件是异步的。它们是在“幕后”实现的,以在JS沙箱外部的后台执行所有操作(例如,从远程服务器中检索内容)。然后,一旦完成工作,他们就会向JS引擎发送一条消息以调用事件。当JS引擎完成当前正在执行的操作时,它将调用排队的任何事件(或等待新消息),然后异步地“神奇地”调用您的回调!

注:这是该主题的非常高级的概念性概述,由于没有任何细节,因为不同的JS引擎将以不同的方式实现事物。但这是其工作原理的一般概念。)


这些是什么事件?一个或两个这样的事件的示例将使您的答案更好。
Jo Smo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.