我经常遇到这个词,即使在使用Google搜索之后,仍然无法理解它的确切含义。对于某人可以提供的异步事件,是否存在一些易于理解(理想情况下为示例)的定义?
谢谢!
Answers:
非编程示例:
同步 如果您想吃披萨作为晚餐,那么您就不适合冷冻了。因此,您必须停止播放WOW,这会使您的公会不高兴。您去厨房,做面团,用酱汁盖住它,加奶酪,然后把它熏成自己喜欢的培根酱。您只花了20分钟的时间来制作披萨,而烤箱则再花10分钟。计时器发出蜂鸣声,然后将热饼拉出。您可以坐在电脑前,吃披萨,然后继续进行突袭。
异步 您在玩WOW时想要吃披萨作为晚餐。您在第五台显示器上打开一个浏览器窗口。您加载了比萨网站,并订购了额外的俗气培根比萨和培根黄油大蒜酱。您返回到团队,20分钟后门铃响起。你拿到比萨。您坐在电脑前坐下来,吃了披萨,然后继续进行突袭。
那么区别是什么呢?一种方法是浪费20-30分钟的宝贵WOW时间,另一种方法是浪费20美元加上小费。
您的页面从服务器传递到客户端浏览器,该浏览器位于Internet上的某个位置。浏览器已将页面绘制在屏幕上,有人(或某些东西)正在查看它。这是一个等待的游戏。眼睛来回移动,快速跳入这个或那个细节,时不时地向侧面飞去,远离屏幕,以调查环境中的干扰。时钟滴答作响。当用户将鼠标悬停在非活动状态时,页面会柔和地发光,手松散地悬在鼠标上,脖子向下弯曲,眼睛越来越专注于吸引您的页面提供的内容。
突然,在没有任何警告的情况下,光标开始移动,这是因为鼠标的手略微僵硬,并开始在桌子的粗糙表面上轻推一点塑料凸起。当鼠标移动时,它在屏幕上的替代品会以近似的模仿方式移动,掠过页面内容中有趣的图像和机智的言论。最终做出决定,动作暂停,一两块肌肉略有收缩,并且用坚决的手指按下鼠标按钮。鼠标中的微动开关会触发电子脉冲,突然,浏览器就会意识到发生了什么:单击鼠标。
总之,关于用户在凝视页面时所做的一切,对于浏览器,网页中的任何客户端代码以及服务器中的所有内容都是无法预测的。人为行动之间没有可知的“等待时间”。因此,由挂接到用户计算机上的设备传输的动作是在发生时发生的,而不是根据可预测的时钟发生的,也就是说,它们是异步发生的。
想想面试的结束,他们说:“不要打电话给我们,我们会打电话给您”。那是异步事件的本质。
通常,您定义函数并显式调用函数。您的程序具有从第1行开始,然后从第2行开始的结构,除了一些条件代码和迭代,调用函数等外,还有一个简单的线性同步结构。
但是在某些情况下,您有一些动作是由程序直接控制之外的事件触发的,这些事件是由程序外部产生的,例如用户界面事件(用户单击鼠标)或网络事件(有人尝试连接到您的服务器)。您的代码不会直接生成这些事件。它们通常是由操作系统根据对用户界面设备和其他系统的监视,在程序外部生成的。这些称为异步事件。
只要记住,“别给我们打电话,我们会打电话给你”
“在编程中,异步事件是独立于主程序流发生的那些事件。异步动作是在非阻塞方案中执行的动作,从而允许主程序流继续进行处理。”
“借助Ajax,Web应用程序可以在后台异步地从服务器检索数据,而不会干扰现有页面的显示和行为。”
当您单击“编辑并保存在SO”时,它是异步发生的。
这是javascript中异步操作的示例(您需要打开javascript控制台)
console.log('One!');
setTimeout(function(){console.log('Two!');},0);
//Doesn't wait
console.log('Three!');};
//OUTPUT:
//One!
//Three!
//Two!
对的调用console.log('Two!')
将在不阻止其后发生的其余代码的情况下执行。
在实际情况下,将setTimeout替换为单击网页上的按钮的人。对按钮单击的响应将最终发生,而不会阻止其他代码执行,例如页面渲染。
同步VS。异步事件
事件发生时会立即调用某些事件处理程序。这些称为“同步”事件。一个示例是DocumentNew。用户一旦创建新文档,就会立即调用它。
但是,某些事件通常在短暂的空闲时间之后,在事件发生后不久被调用。这些称为“异步”事件。它们是异步的,因为如果在事件发生的确切时间调用用户编写的宏,它将破坏Source Insight。
如果代码是同步的(或同步的),则意味着每段代码都按顺序依次运行,而下一段代码要等到上一行完成后才能运行。大多数代码通常是同步的。
如果代码是异步(或异步)的,则意味着代码可以单独运行,并且可以独立于其他代码运行。如果一堆同步代码中间存在异步代码,则在此特定问题的上下文中,无论您将其放在同步代码中的什么位置,异步代码仅在事件被触发时才运行。它是完全独立的,并且与同步代码无关,并且只要它的事件发生就可以运行,而不仅是在上一段代码运行完成时。这样的一些示例是针对在一定时间间隔上运行的代码,成功保存文件之后,发送Web请求之后,用户单击按钮时或图像加载后按时间间隔运行的代码。