bru*_*eaf 10 javascript browser asynchronous
在John Resig的书"Javascript Ninja的秘密"中,他做出如下断言:
浏览器的编程没有什么不同,除了我们的代码不负责运行事件循环和调度事件; 浏览器为我们处理.
我们的职责是为浏览器中可能发生的各种事件设置处理程序.这些事件在发生时被放置在事件队列(FIFO列表;稍后会有更多内容)中,并且浏览器通过调用已为其建立的任何处理程序来调度这些事件.
因为这些事件发生在不可预测的时间并且以不可预测的顺序发生,所以我们说事件的处理以及它们的处理函数的调用是异步的.
我很难接受在这里使用术语异步.他不是真的意味着同步吗?它们也可能是异步的,但不是出于支持此声明的原因.思考?
您的问题标题和问题正文似乎在问两个不同的事情。我会尝试解决这两个问题。
身体问题
异步不是 John 创造的术语,甚至不是 JavaScript 特定术语。它在计算机科学中具有既定的含义。虽然约翰说的是准确的,但我认为它是不完整的。他正确地解释了为什么我们使用异步这个术语(词源),但没有解释什么是异步编程。
在计算机科学中,异步意味着暂停执行代码,允许其他(任意)代码在同一线程中运行,并最终恢复暂停的代码。有很多技术可以实现这一点,也有很多方法可以为程序员抽象这一点,但它们都有一个共同的特点:暂停代码而不是阻塞。这用于避免在等待某些慢速资源(如 HTTP 请求、文件或数据库)时阻塞整个线程。
例如,如果您要发出同步HTTP 请求,则在请求完成之前,其他 JavaScript 都无法运行。因此,网页中依赖于 JavaScript 的任何部分都将被冻结。但是,如果您发出异步HTTP 请求,发出请求的代码可能会在等待请求时挂起。这允许执行其他代码。HTTP 请求完成后,请求代码可以恢复。
John 之所以说异步代码可以发生在任何顺序,是因为我们不知道外部资源何时可用。例如,如果发出两个或多个异步 HTTP 请求,则无法知道请求将按什么顺序完成(因此,代码将按什么顺序恢复)。
标题问题
浏览器事件是异步的,就像我们的示例 HTTP 请求一样。事实上,在很多方面,用户只是一种其他外部资源。用户将在自己的时间做事,与当前正在执行的代码异步。
例如,如果您的代码定义了页面上按钮的单击事件的处理程序。您的 JavaScript 代码不会等待用户单击按钮。它会挂起单击处理程序的代码,并稍后在用户单击按钮时执行它。这就是为什么异步编程在 JavaScript 中如此重要的核心。如果您的代码只是阻塞(等待)直到 HTTP 请求完成,则用户无法单击该按钮。如果您的代码在等待用户单击某些内容时发生阻塞,那么您的 HTTP 请求就会超时。
最后的想法
在 JavaScript 中,我们通常不会想到暂停和恢复代码。事实上,您不能只是在正在运行的代码块中间暂停。该块始终会在执行其他任何操作之前完成。相反,我们将回调传递出代码块以便稍后执行。这些回调可以同时访问原始代码块中的资源(范围)。回调是从原始上下文中恢复的。
如果您想深入了解 JavaScript 如何管理并发模型和事件循环,这是一个很好的资源。此外,除了回调之外,JavaScript 还为事件循环添加了一些强大的抽象,例如Promises和Generators。这些都值得花一些时间。
Max*_*drv -1
JavaScript 是异步的...它将继续处理代码,即使您调用的方法尚未返回...所以是的,这是正确的。这就是异步的定义:不同步......
我收到你的询问...因为先进先出...但我认为使用的术语是合适的...因为它的定义与他们所说的完全一样。
归档时间: |
|
查看次数: |
6043 次 |
最近记录: |