javascript 暂停函数执行直到事件被触发
javascript pause function execution until event is triggered
我正在制作一个 javascript 小部件(用于 thingsboard 平台)。 thingsboard 站点有一些我无法修改的 javascript 代码 运行ning(例如 do_some_things
)。我的小部件可以定义诸如 func_1
之类的函数,这些函数将被 thingsboard 网站 运行。
//### THINGSBOARD CODE (can not modify!) ###
function do_some_things() {
...
func_1();
func_2();
...
}
//### WIDGET CODE (can modify!) ###
function func_1() {
socket = new WebSocket("ws://192.168.137.4:8081/");
socket.onmessage=function(evt) {
settings_string = evt.data;
}
/* wait for a message here!*/
return settings_string;
}
在 func_1
我想 return 我从 websocket 服务器检索的一些字符串。我如何阻止 func_1
的执行直到我收到 websocket 消息?
我看过 promises 和 await,但我看不出这对我有什么帮助,因为我不能在 func_1
完成之前允许 func_2
到 运行并 return 编辑了它的值。
(我不在乎整个网站在等待 websocket 时是否冻结)
感谢 Bergi 的评论。
If you cannot modify do_some_things, you'll have a hard time. You
could queue your work, but if do_some_things ever expects a return
value then that will be impossible to provide synchronously. One
cannot block on a websocket. – Bergi
我承认问题无法在 javascript 中解决,只要不能编辑函数 do_some_things
并希望通过 websockets 检索数据。
我现在找到了一个解决方法,即在与 websocket 服务器相同的机器上设置一个小型 http 服务器,该服务器提供一个包含 return 字符串的 json 文件。我可以以阻止 func_1
执行的方式请求文件,如下所示:
function func_1() {
var request = new XMLHttpRequest();
request.open('GET', "http://192.168.137.4:8082/", false);
request.send(null);
if (request.status == 200) {
return request.responseText;
} else {
return "";
}
}
与 websocket 不同,XMLHttp 支持同步请求。
我正在制作一个 javascript 小部件(用于 thingsboard 平台)。 thingsboard 站点有一些我无法修改的 javascript 代码 运行ning(例如 do_some_things
)。我的小部件可以定义诸如 func_1
之类的函数,这些函数将被 thingsboard 网站 运行。
//### THINGSBOARD CODE (can not modify!) ###
function do_some_things() {
...
func_1();
func_2();
...
}
//### WIDGET CODE (can modify!) ###
function func_1() {
socket = new WebSocket("ws://192.168.137.4:8081/");
socket.onmessage=function(evt) {
settings_string = evt.data;
}
/* wait for a message here!*/
return settings_string;
}
在 func_1
我想 return 我从 websocket 服务器检索的一些字符串。我如何阻止 func_1
的执行直到我收到 websocket 消息?
我看过 promises 和 await,但我看不出这对我有什么帮助,因为我不能在 func_1
完成之前允许 func_2
到 运行并 return 编辑了它的值。
(我不在乎整个网站在等待 websocket 时是否冻结)
感谢 Bergi 的评论。
If you cannot modify do_some_things, you'll have a hard time. You could queue your work, but if do_some_things ever expects a return value then that will be impossible to provide synchronously. One cannot block on a websocket. – Bergi
我承认问题无法在 javascript 中解决,只要不能编辑函数 do_some_things
并希望通过 websockets 检索数据。
我现在找到了一个解决方法,即在与 websocket 服务器相同的机器上设置一个小型 http 服务器,该服务器提供一个包含 return 字符串的 json 文件。我可以以阻止 func_1
执行的方式请求文件,如下所示:
function func_1() {
var request = new XMLHttpRequest();
request.open('GET', "http://192.168.137.4:8082/", false);
request.send(null);
if (request.status == 200) {
return request.responseText;
} else {
return "";
}
}
与 websocket 不同,XMLHttp 支持同步请求。