我研究了又研究,但对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/