关于JavaScript中实现异步处理、同步等待是否可以?

yyfzy yyfzy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我目前有个需求,是客户端JS和服务器端的之间通过websocket通信(服务器端不是Web服务器,也不可能配置为Web服务器):客户端发送一个操作请求消息、服务器端接到消息之后处理并返回一个结果。

由于JS是单线程顺序处理、而网络通信又是异步的,怎么样我才能让客户端的JS程序在发送一个命令之后、等待服务器返回结果之后再往下执行(类似C++/Java中的WaitForEvent)?

用个栗子说明下:

var _socket;

function init () {
// 创建一个Socket实例,尝试连接服务器
_websocket = new WebSocket('ws://127.0.0.1:' + _serverPort);

// 握手成功
_websocket.onopen = function (e) {
_isConnected = true;
};

// 监听消息
_websocket.onmessage = function(event) {
_isResponded = true;
_respData = event.data;
};

// 监听Socket的关闭
_websocket.onclose = function(event) {
socket = null;
alert("连接关闭!");
};
}

function waitForResp() {
while(!_isResponded) {}; //这样写是不行的,因为JS不能响应socket的onmessage事件了!!!
}

function getServerTime() {
var time;
_websocket.send("{get_time}"); //1
waitForResp(); //2
//此处处理响应数据 //3
return time; //4
}

上面的代码,我是想调用getServerTime()等得到服务器响应之后才返回,也就是说该函数本身希望是阻塞(同步)的。然后,等待函数 waitForResp()该怎么实现才能保证在JS等待的同时还能响应onmessage()事件呢?

谢谢!
...全文

相关推荐

vue axios同步请求解决方案

主要介绍了vue axios同步请求解决方案,需要的朋友可以参考下

weixin_38516380

JavaScript 提升运行速度之循环篇 译文

根据Nicholas 的说法,有四种代码 会拖慢脚本的运行,并最终导致脚本失控。分别是次数过多的同步循环、庞大的函数体、不恰当的递归和不合理的DOM 调用。

weixin_38621082

详解从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出。 文章的原地址:https://github.com/answershuto/learnVue。 在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助。 可能会有理解存在偏差的地方,欢迎提issue指出,共同学习,共同进步。 操作DOM 在使用vue.js的时候,有时候因为一些特定的业务场景

weixin_38678022

原生JavaScrpit中异步请求Ajax实现方法

主要介绍了原生JavaScrpit中异步请求Ajax实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

weixin_38645208

ajax设置async校验用户名是否存在的实现方法

下面小编就为大家带来一篇ajax设置async校验用户名是否存在的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38628647
评论 20
收藏 已收藏
分享
返回顶部
yyfzy
JavaScript 87,983 成员 224,681 内容