gpt4 book ai didi

JavaScript 异步回调

转载 作者:行者123 更新时间:2023-12-03 06:33:59 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com