Javascript异步回调

时间:2016-07-12 00:42:29

标签: 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()以便以后使用吗?好像我还在等待回调函数。我似乎无法理解这是如何允许函数并行运行的。也许有人可以为我或其他人逐步概述执行。

1 个答案:

答案 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/