javascript暂停执行功能,直到触发事件

时间:2019-02-19 15:22:12

标签: javascript websocket async-await thingsboard

我正在制作一个javascript小部件(用于Thingsboard平台)。 Thingsboard网站上有一些我无法修改的JavaScript代码正在运行(例如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中,我想返回一些我从websocket服务器检索到的字符串。在收到网络套接字消息之前,如何阻止func_1的执行?

我已经查看了诺言并等待,但是我看不出有什么帮助,因为我无法允许func_2func_1完成并返回其值之前运行。

(我不在乎整个网站在等待网络套接字时是否冻结)

1 个答案:

答案 0 :(得分:0)

谢谢Bergi的评论。

  

如果您不能修改do_some_things,将会很困难。您   可以将您的工作排队,但是如果do_some_things曾经期望得到回报   值,那么将无法同步提供。一   无法阻止websocket。 –贝尔吉

我接受了该问题,因为无法编辑javascript do_some_things并希望通过websockets检索数据是无法解决的。

我现在找到了一种解决方法,方法是在与websocket服务器相同的机器上设置一个小型http服务器,该服务器提供包含返回字符串的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 "";
    }
}

因为XMLHttp支持与websocket不同的同步请求。