我是JavaScript新手,当我在“ JavaScript the good parts ”一书中读到它时,我对异步函数有疑问:
我了解以下代码将同步执行并可能导致延迟:
request = prepare_the_request();
response = send_request_synchronously(request);
display(response);
但是,以下代码被称为异步执行:
request = prepare_the_request();
send_request_asynchronously(request, function(response){
display(response);
});
编译器(或解释器?我不确定如何解释JavaScript)知道第二个代码块是否应该异步执行?
提前谢谢。
(如果问题不明确请发表评论,我很抱歉没有明确表达。)
答案 0 :(得分:1)
Compiler / Interpreter不知道,实际上并不关心它。在多进程操作系统上,两个或多个线程可以并发运行,Javascript的XMLHTTPRequest对象允许在单独的线程中运行请求。这样,Javscript启动线程,但由于它在一个单独的线程中运行,它不会等待并继续下一个命令。
答案 1 :(得分:1)
我完全诚实......我第一次阅读 Javascript,好的部分第53页上的 Callbacks 部分,我也做了和哈哈哈一样的假设,虽然后来我才发现作者的意思。
您之前的陈述实际上并不正确:
但是,以下代码被称为异步执行:
在作者使用回调函数显示代码之前,他说以下段落:
更好的方法是发出异步请求,提供一个 当服务器响应时将调用的回调函数 接收。异步函数立即返回,因此客户端 没有被阻止:
这里的重要部分是: ...发出异步请求,提供回调函数......
作者试图说明你可以制作如下函数:
send_request_asynchronously(request, function (response) {
display(response);
});
在代码通过解释器运行时不会执行function (response) {display(response);}
,而是在将来调用send_request_asynchronously
并在代码中进行调用时的某个时间你可以让它异步。代码本身没有任何异步。它被设计为稍后异步调用。
"提供回调函数"是推断这是作者的意思的关键。如果您注意到,回调函数后没有尾随()
。如果你确实有这样的尾随()
:
send_request_asynchronously(request, function (response) {
display(response);
}());//<--- right here
然后当解释器正在读取代码的那一部分时,函数会立即执行,从而迫使系统 S ynchronous,其中不包括()
,通过实现具有异步功能的代码然后调用此函数,为将来 A 同步打开了大门。
作为最后一个重点,让我们记住这就是使回调函数成为回调函数的原因。在函数中包含函数时,不会调用它。例如,如果我创建一个称为称呼的函数:
var salutations = function (hello(){alert('hi')})
{
alert ('salutations!');
}
如果我在上一段代码之后没有更多代码,你将永远不会看到一个警告弹出窗口。只有在声明/启动后调用/调用时才会调用它(HENCE术语:&#34;它被回调&#34;在创建AKA回调之后)。但是,如果我在回调函数之后包含一个尾随()
,那么它将导致函数在声明和启动函数salutations
期间实际执行。