似乎在Javascript中,至少在jQuery库和WebSocket API中,您可能在事件发生后绑定到事件,但仍然能够捕获它们。我有两个例子,我不明白除了运气/时间之外它们是如何可能的(不知何故总是100%,所以显然不是这样)。
的jQuery
采用jQuery的AJAX库。不知怎的,你可以打电话,然后抓住事件
$.post(url, data)
.done(function(response){
console.log(response);
});
我显然已经发送了post
。事后我怎么能把'完成'事件附加到它?
的WebSocket
同样的交易。一旦你创建了一个websocket,它就会尝试连接。在它可能已经打开之后,我怎样才能捕捉到开放事件,即连接事件?这两种设备是否都依赖于这些连接无法在某种程度上进行一些时间的事实?可能比处理实际代码要慢?
let ws = new WebSocket('wss://localhost:123');
ws.addEventListener('open', function(event){
console.log(event);
});
答案 0 :(得分:1)
这些被称为回调。
当事件返回"已完成&#34>时,将处理回调。状态。这是该语言的一部分。它是在引擎盖下#34;这就是为什么它对你不可见。
https://developer.mozilla.org/en-US/docs/Glossary/Callback_function
这是对MDN回调的介绍。
关于事件处理程序:
Javascript是当今的一种自适应编译语言,具体如何运作取决于引擎。
http://voidcanvas.com/is-javascript-really-interpreted-or-compiled-language/
这里有一种划伤表面的参考。
答案 1 :(得分:0)
这两种设备是否都依赖于这些连接不可避免地需要一些时间的事实?
这就是现场。对于运行时间较长的进程,我们有时不希望阻止所有其他代码的执行。这就是异步调用的强大功能。
我们可以允许程序在等待更长时间运行的进程完成时继续执行。
因此,在您的jQuery AJAX示例中,HTTP POST请求正在data
url
由于对服务器的调用可能需要一些时间,因此我们可能希望在程序等待来自服务器的响应时运行其他代码。
因此,如果要执行此代码块
$.post(url, data)
.done(function(response){
console.log("I finally got a response from the server!");
});
console.log("I'm not gonna wait for that response.");
您会看到第一个打印的第二个日志语句,即"I'm not gonna wait for that response."
,因为HTTP请求仍在处理中。
一旦响应返回,将打印第一个日志语句,因为请求现在已完成。
$.post(url, data)
函数调用本身返回一个Deferred对象,它是一个处理绑定到异步进程的事件的接口。
在这种情况下,done
事件可用于程序处理从服务器返回的任何响应。
您可以在此处找到Deferred对象提供的其他事件处理程序:https://api.jquery.com/category/deferred-object/
所有这些也可以应用于WebSocket示例。作为第二个参数传递的函数只是处理连接尝试结果的处理程序,无论它是否成功。