JavaScript 异步回调

标签 javascript asynchronous parallel-processing callback

我研究了又研究,但对javascript中的异步情况不太了解。考虑以下阻塞行为:

var data = getData();
alert(data);

function getData(){

    //takes a while to do stuff
    return stuff;
}

相反,它应该是:

getData(function(data){
    alert(data);
});

function getData(callback){

    callback();

}

这如何避免阻塞?我似乎不明白这与从另一个函数中调用一个函数有什么不同。我不是只是将函数定义作为回调传递给 getData() 以便稍后使用吗?看来我仍然在等待回调函数。我似乎无法理解这如何允许函数并行运行。也许有人可以为我或其他人一步步概述执行过程。

最佳答案

即使认为 Javascript 通常被视为一种而非多线程编程语言,这是正确的,因为它不具有并发功能,例如Java 中的线程,但在我们的 Javascript 引擎(如 V8)深处......它实际上是多线程的。哈。

那么,当您调用如下所示的异步方法时,到底会发生什么?

$.get( "www.helloWorld.com/test.html", function( data ) {
  alert( "Load was performed." );
});
alert("Hey there!");

$.get()是什么,请引用https://api.jquery.com/jquery.get/

当您的代码到达异步 $.get() 方法时,实际上会从 Javascript 引擎生成一个线程,该线程会离开主线程并单独执行操作。

在本例中,针对 www,helloWorld.com 端点发出 HTTP GET 请求,以获取 test.html 页面的数据。

当这一切发生时,与主线程分开,您的主线程不会等待其返回,而是将回调函数传递给 $.get() API 指示它“回电”/在完成工作后运行其中的逻辑。在此示例中,我们执行一个简单的警报(“已执行加载”),而在现实场景中,您通常希望读取响应数据并流行变量或将文本粘贴到文本框中。 p>

因此,代码实际上不会等待 $.get() 完成,而是转到下一行来执行更多操作。对于本例,alert("嘿,那里");

如果你再考虑一下这个场景,异步函数 $.get() 实际上不会阻塞主线程处理其他代码行,而 $.get() 在幕后运行。因此异步编程模型被认为是非阻塞的。

非阻塞概念也类似于 NodeJs 的事件驱动架构,可能值得一读。

https://nodesource.com/blog/understanding-the-nodejs-event-loop/

关于JavaScript 异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38318304/

相关文章:

javascript - 温泉用户界面 : Back and Menu Button

javascript - 带有附加外部页面的 jQuery ajax 加载页面

javascript - 输入文本框的正则表达式

c++ - 迷宫求解器的复杂性

r - 数据表和并行计算

javascript - Flask + Ajax 集成 : AttributeError: 'WSGIRequestHandler' object has no attribute 'environ'

c# - 什么时候应该在 ASP.NET MVC 中使用异步 Controller ?

javascript - 您如何处理在异步函数之间共享的变量的拼接?

c# - 如何使用 HttpListener 同时处理多个连接?

c# - 在达到一定的数据集大小后,并行代码是否应该比顺序代码运行得慢?