3

我是 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 是如何解释的)如何知道第二个代码块应该异步执行?

先感谢您。

(如果问题不清楚,请发表评论,我很抱歉没有表达清楚。)

4

2 回答 2

1

编译器/解释器不知道这一点,实际上并不关心它。在多进程操作系统上,两个或多个线程可以同时运行,Javascript 的 XMLHTTPRequest 对象允许在单独的线程中运行请求。这样,Javscript 启动线程,但由于它在单独的线程中运行,它不会等待并继续执行下一个命令。

于 2013-12-22T05:49:00.787 回答
1

老实说……我第一次阅读Javascript第 53 页上的相同回调部分时,好的部分,我也做了和你一样的假设哈哈哈,虽然后来我才知道作者的意思.

您之前的陈述实际上并不正确:

但是,据说以下代码是异步执行的:

在作者展示带有回调函数的代码之前,他说了以下段落:

更好的方法是发出一个异步请求,提供一个回调函数,当接收到服务器的响应时将调用该回调函数。异步函数立即返回,因此客户端不会被阻塞:

这里的重要部分是:...发出异步请求,提供回调函数...

作者试图指出您可以创建如下函数:

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

那么当解释器正在阅读代码的那部分时,该函数将立即执行,从而强制系统同步,如果不包括,您将打开大门,使其在未来成为A同步使用异步功能实现代码,然后调用此函数。()

最后一点,让我们记住,这就是使回调函数成为回调函数的原因。当您在参数中包含函数时,它不会被调用。例如,如果我创建一个名为 salutations 的函数:

var salutations = function (hello(){alert('hi')})
{
   alert ('salutations!');
}

如果在上一个代码之后我没有更多代码,您将永远不会看到警报弹出窗口。它只会在它的声明/启动之后被调用/调用时被调用(因此术语:在创建 AKA 回调之后“它正在被回调”)。但是,如果我在回调函数之后包含一个尾随(),它将导致该函数在声明和启动 function 期间实际执行salutations

于 2016-06-04T03:22:58.733 回答