如何在Javascript中准备好值或条件之前阻止应用程序继续运行[重复]

Posted

技术标签:

【中文标题】如何在Javascript中准备好值或条件之前阻止应用程序继续运行[重复]【英文标题】:How to prevent application from continuing until a value or condition is ready in Javascript [duplicate] 【发布时间】:2019-05-07 13:08:56 【问题描述】:

我还是 javascript 的新手,我正在尝试使用 WebSockets。我有一个应用程序的工作框架,但它仍然有我需要解决的问题。

如何向应用程序的其余部分发出 Web 套接字已准备好使用的信号?

socket = new WebSocket( 'wss://' + window.location.host + '/ws/manager/' );
while (socket.readyState != 1)
    // wait loop

创建套接字后,它会立即返回,但尚未准备好进行通信。我的第一个想法是我只是在检查状态时循环,这是我当前的解决方案,但这只会烧毁 CPU 并使应用程序无响应。引入延迟可以解决一些响应问题,但这有其自身的问题,如下所示:What is the JavaScript version of sleep()? 例如。我也明白循环等待是不行的。

我看到的另一个解决方案是使用setTimeout() 和回调来继续执行,但我觉得这会对代码读写造成很大的干扰,并且可能仍然无法以更好的方式完全解决问题。

这将是一个单页应用程序,由于 ajax 或传统 HTTP 需要大量连接,服务器通信将几乎完全使用 Web 套接字完成。一般来说,我并不介意应用程序会变得无响应,因为如果没有 Web 套接字,它无论如何都将毫无用处。

【问题讨论】:

使函数异步并将等待添加到套接字? javascript.info/async-await 这就是我遇到麻烦的地方。如果我使函数异步并使用等待,那么只会将问题移到下一个级别,不是吗?调用async函数重新连接会立即返回,我仍然不知道socket什么时候连接。 @Dementic,感谢您指出这一点。我想我把自己弄进了一个深洞。该问题和答案提供了我正在寻找的反馈。 javascript(在浏览器中)通常是单线程业务。所以“等待”没有多大意义(等待什么?)。很难从您的问题中判断是否有任何东西在后台运行。如果没有,我不确定您要实现什么(在套接字准备好之前,套接字上的侦听器无论如何都不会工作)。 @LongChalk 我正在尝试解决应用程序刚刚启动(没有运行)并且应用程序遇到断开连接(东西正在运行)的情况,因此这两种情况都需要解决方案。 “等待”是直到应用程序实际上可以通过 WebSocket 做一些有用的事情 【参考方案1】:

您可以像这样在 WebSocket 上监听“onopen”事件:

socket = new WebSocket('wss://' + window.location.host + '/ws/manager/');
socket.addEventListener('open', function (event) 
  socket.send('Hello socket server!');
  // Do more stuff with your socket
)

这样,您的应用程序将在 WebSocket 加载时做出响应,并且您不会浪费任何 CPU。

有关 WebSocket API 的更多信息,请查看此处: https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

希望这会有所帮助!

【讨论】:

虽然我的问题是重复的并且我接受这一点,但我仍然不明白当您不想无限期地等待听众触发时这将如何工作。您如何将其与超时机制绑定? 这是一个完全不同的问题。我建议您进一步研究承诺或竞争条件:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 实现超时机制的示例代码:(new Promise((resolve, reject) => socket.addEventListener('open', resolve);setTimeout(reject, 1000))).then(() => alert('connected')).catch(() => alert('timed out...'))

以上是关于如何在Javascript中准备好值或条件之前阻止应用程序继续运行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何更改android服务的优先级(好值)?

如何阻止用户在 Javascript 中关闭窗口?

GWT:在页面准备好之前开始运行(或者正文资源不会阻止运行 gwt)?

如何阻止、停止或终止 Javascript 函数?

如何阻止 JavaScript 函数影响子元素?

如何在对象完全加载到$ scope之前阻止DOM加载?