我已经学过并研究过,但我不了解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()
以便以后使用吗?好像我还在等待回调函数。我似乎无法理解这是如何允许函数并行运行的。也许有人可以为我或其他人逐步概述执行。
答案 0 :(得分:1)
甚至认为Javascript通常被视为 NOT 多线程编程语言,这是正确的,因为它没有并发功能,例如Java中的threads
,但深入我们的J8引擎,如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引擎生成一个线程,以便从主线程中单独执行操作。
在这种情况下,针对HTTP GET
端点发出www,helloWorld.com
请求以获取test.html
页面的数据。
虽然这一切都发生了,但与主线程分开,主线程 不 等待它的返回,而是将回调函数传递给{{1 API指示它“回叫”/在它完成工作后运行其中的逻辑。在这个例子中,我们做了一个简单的$.get()
,而在现实世界的场景中,你通常想要阅读响应数据和流行的变量,或者将文本粘贴到文本框中。
因此,代码不是等待alert("Load was performed")
完成,而是实际转到下一行以执行更多操作。对于此实例,$.get()
。
如果再次考虑这种情况,异步函数alert("Hey there");
实际上是 不阻塞 主线程处理其他代码行,而{{ 1}}在场景后面运行。因此,异步编程模型被认为是非阻塞的。
非阻塞概念也类似于NodeJs的事件驱动架构,值得一读。
https://nodesource.com/blog/understanding-the-nodejs-event-loop/