如何在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中准备好值或条件之前阻止应用程序继续运行[重复]的主要内容,如果未能解决你的问题,请参考以下文章