- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 javascript
中使用 WebSocket
。 WebSocket
需要 url 作为构造函数参数并立即尝试连接。我只能在构造它之后设置onopen
方法。
所以,如果 WebSocket
在我设置 onopen
之前已经建立了连接,那么我会错过 onopen
事件!
我怎样才能避免这种情况?
模拟它:
一个)
1) 在 Chrome 中,打开 websocket .2) 按 F12 打开开发者工具。3) 打开控制台4)一次复制并粘贴所有这些代码!输入!
uri = "ws://echo.websocket.org?encoding=text";
websocket = new WebSocket(uri);
websocket.onopen = function(evt) { console.log('EHE')};
B)
重复 1-2-3
4) 复制并粘贴这些代码并运行
uri = "ws://echo.websocket.org?encoding=text";
websocket = new WebSocket(uri);
5) 稍等
6) 运行这段代码:
websocket.onopen = function(evt) { console.log('EHE')};
结果:
在 A) 中调用 onopen。在 B) 我们错过了!
最佳答案
由于 Javascript 的单线程事件驱动特性,您描述的情况不会在实际代码中发生。在您当前的 Javascript 部分完成之前,无法触发“打开”事件。因此,您始终能够在事件发生之前设置您的 onopen
事件处理程序。
在调试器或控制台中插入人为暂停是一种人为情况,不会在实际代码中发生。
实际代码中发生的是这样的:
new WebSocket(uri)
.onopen
属性和设置您的事件处理程序。open
事件,Javascript 将触发该事件,从而导致您的 .onopen
处理程序被调用。open
事件尚未完成,Javascript 将等待下一个事件插入事件队列并运行它,一遍又一遍地重复该过程。最终这些事件之一将成为您的 open
事件。关键是 .onopen
是通过异步事件调用的。因此,它必须通过 Javascript 事件队列。并且,在您当前的 Javascript 部分完成并返回给解释器之前,事件队列中的任何事件都不能运行。这就是 Javascript 的“事件驱动”特性的工作原理。因此,由于该架构,只要将 .onopen
处理程序安装在调用构造函数的同一部分 Javascript 中,就不会错过 onopen
事件。
如果它能让您感到舒服的话,node.js 中有许多 API 都依赖于相同的概念。例如,当您使用 fs.createReadStream(filename)
创建文件流时,您必须创建流,然后添加事件处理程序(其中一个事件处理程序用于 open
事件)。同样的逻辑也适用于那里。由于 Javascript 的事件驱动特性,不存在竞争条件。 open
事件或 error
事件无法在您的其余 Javascript 运行之前触发,因此您始终有机会在事件处理程序被调用之前安装它们。
如果可以同步检测到错误(例如错误的文件名或错误的 uri)并且可以立即触发 error
事件,则使用类似 setImmediate(function() {/* 在此处发送错误事件*/})
以确保在代码有机会安装事件处理程序之前不会触发错误事件。
关于javascript - 我如何保证调用 websocket onopen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49210034/
不久前,我为我的一个电子表格编写了一个脚本,它使用可安装的触发器 onOpen 来启动 SpreadsheetApp.getUi 函数。 该函数如下所示: function addMenu() {
大家好,我试图在我的谷歌表格每次打开时显示一个侧边栏。我正在使用 onOpen 函数并调用 html 页面,但它没有执行。当我手动运行该函数时,它可以工作,但是当打开谷歌工作表时它不会自行执行。这是我
我正在使用 XSockets 3.x(最新)。 我已经设置了一个 Controller : public class NotificationsController : XSocketControll
我在使用 WebSocket 时遇到了一个奇怪的问题。当我打开一个新的套接字时,我让服务器和客户端互相发送握手消息。但是,该代码似乎仅有时会执行。 服务器代码(ruby): # Set up the
我在电子表格的脚本编辑器中编写了一个函数,该函数旨在关注包含当前日期的单元格。一般来说,当函数由菜单项触发时它会起作用,但加载电子表格后它不会聚焦在任何单元格上。 function onOpen()
我目前正在编写一个聊天应用程序。到目前为止,用户可以互相发送消息,我可以将消息存储在我的数据库中。现在,当用户打开页面向另一个用户发送消息时,我想在我的 onOpen 函数中显示存储在数据库中的消息。
在 .Net 中,我如何监控文件是否已被其他程序访问(打开)?我在 FileSystemWatcher 中看不到 OnOpened 事件,所以我认为它不能那样做。还有其他方法吗?这在 Windows
我在 javascript 中使用 WebSocket。 WebSocket 需要 url 作为构造函数参数并立即尝试连接。我只能在构造它之后设置onopen方法。 所以,如果 WebSocket 在
paper-dialog 是否有“onOpen”事件?我想知道对话框何时完全“打开”和“关闭”,主要是为了在对话框完成其打开动画时更改内容。 以前in Polymer 0.5 one can list
我正在使用 Angular 4 和 Material 制作一个网络应用程序。我正在使用 Material “Sidenav”组件。如果 sidenav 打开或关闭,我想触发一个事件。通过向按钮的 cl
我正在尝试学习 WebSockets,并且我已经在 Node 中创建了一个 websocket 服务器,现在正在研究浏览器实现。我已经使用名为 Smart WebSocket Client 的 chr
我试图让一段代码在电子表格打开时工作。我添加了 onOpen 脚本,将脚本触发器设置为“当电子表格打开时”,然后等待......什么也没有发生。我做错了什么? 该脚本基本上根据单元格的值将一行从一张纸
我正在使用 materializecss ,那是 sideNav 初始化,但是 onOpen 属性不起作用。 $('.button-collapse').sideNav({
每当我尝试使用此 JS 代码连接到我的计算机上的 WebSocket 服务器时,我总是收到错误消息: $(document).ready(function () { var ws; t
此代码片段在打开工作表时创建了一个自定义菜单,如预期的那样: function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMen
有没有一种方法可以将参数添加到将添加到 Google 电子表格文档的脚本中心菜单中的函数?这是正常的 onOpen 方法。 function onOpen() { var sheet = Spre
Google Apps Script 中的内置 onOpen 触发器仅在用户 时运行具有编辑权限打开电子表格或文档。我正在开发一个电子表格,其中只有开发人员具有编辑权限,所有其他用户必须具有仅查看权限
我收到以下错误: 无法在“WebSocket”上执行“发送”:仍处于 CONNECTING 状态。在我发送消息之前,是否有一个事件可以检查以确保套接字完全连接。 我的代码如下: thi
我的功能包括向文档添加菜单和toast。我已经验证触发器(onOpen)也已设置。它仅在用户进入“工具”、“脚本管理器”、“运行”时才起作用。我们有太多具有太多背景的用户,因此无法期望知道如何做到这一
我无法在打开电子表格时运行我的脚本。我已手动设置触发器see 。授权范围也已设置。 该代码旨在从工作表中的表中获取一些联系人信息,创建一个联系人,然后将该联系人添加到表中指定的电子邮件列表中。有一个功
我是一名优秀的程序员,十分优秀!