关于JavaScript中实现异步处理、同步等待是否可以?
我目前有个需求,是客户端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()事件呢?
谢谢!
由于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同步请求解决方案,需要的朋友可以参考下
JavaScript 提升运行速度之循环篇 译文
根据Nicholas 的说法,有四种代码 会拖慢脚本的运行,并最终导致脚本失控。分别是次数过多的同步循环、庞大的函数体、不恰当的递归和不合理的DOM 调用。
详解从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的时候,有时候因为一些特定的业务场景
原生JavaScrpit中异步请求Ajax实现方法
主要介绍了原生JavaScrpit中异步请求Ajax实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
ajax设置async校验用户名是否存在的实现方法
下面小编就为大家带来一篇ajax设置async校验用户名是否存在的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


