This question already has answers here:
Are all javascript callbacks asynchronous? If not, how do I know which are?
(5个答案)
5年前关闭。
如果我没记错的话,JavaScript回调与非阻塞函数一起使用。 (例如,从文件中读取数据或从服务器中获取数据)。
现在是什么使javascript函数无阻塞?如果我想编写一个非阻塞的javascript函数怎么办?定义非阻塞javascript函数的主要结构是什么。
在以下代码中,
(5个答案)
5年前关闭。
如果我没记错的话,JavaScript回调与非阻塞函数一起使用。 (例如,从文件中读取数据或从服务器中获取数据)。
现在是什么使javascript函数无阻塞?如果我想编写一个非阻塞的javascript函数怎么办?定义非阻塞javascript函数的主要结构是什么。
在以下代码中,
ready , click , slideUp
用作非阻塞函数。它们如何成为非阻塞功能?$(document).ready(function(){
$("button").click(function(){
$("p").slideUp(2000, function(){
$("p").slideDown(2000);
});
});
});
最佳答案
非阻塞功能是设置操作,启动该操作然后使用异步资源在后台管理完成操作的任何功能。浏览器中的异步资源包括系统计时器,ajax调用,CSS动画,webWorkers等。
在问题所在的代码示例中,.slideUp()
和.slideDown()
都是jQuery动画,它们使用计时器在每个计时器刻度上进行一些移动。因此,它们是异步的。
您还可以在webWorker(单独的线程)中执行某些类型的Javascript代码。浏览器中的webWorkers只能执行有限的操作(例如,它们根本无法触摸DOM),必须从完全独立的脚本中加载它们,不能与您的主要javascript共享任何变量,并且仅通过消息传递方案与主要javascript通信。但是,您可以使用webWorkers在另一个线程中运行某些类型的Javascript。这是summary of webWorkers on MDN。
您无法从字面上使您的代码具有魔术般的异步性,因为运行Java脚本的线程一直运行到Java脚本中的完成,然后完成该事件,然后处理事件队列中的下一个事件。有时,您可以通过在计时器上分小块地完成工作来模拟“后台处理”。这允许将其他操作(用户事件处理,其他计时器事件等)与您自己的执行交织在一起,但是它需要以完全不同的方式编写代码,以便可以在计时器上以小块的形式工作,而不是只是串行执行。
以下是一些有用的引用:
Best way to iterate over an array without blocking the UI
How does JavaScript handle AJAX responses in the background?