выполнение функции паузы javascript до момента запуска события - PullRequest
0 голосов
/ 19 февраля 2019

Я делаю виджет JavaScript (для платформы Thingsboard).на сайте тесбордов работает какой-то JavaScript-код (например, do_some_things), который я не могу изменить.Мой виджет может определять такие функции, как func_1, которые будут запускаться сайтом тайтбордов.

//### 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 Я хотел бы вернуть некоторую строку, которую я извлекаю с сервера веб-сокетов.как мне заблокировать выполнение func_1, пока у меня не появится сообщение websocket?

Я посмотрел на обещания и жду, но я не понимаю, как это может помочь мне, поскольку я не могу позволить func_2 до запуска func_1 и возврата его значения.

(мне все равно, если весь сайт зависнет, пока он ждет веб-сокета)

1 Ответ

0 голосов
/ 20 февраля 2019

Спасибо Берги за комментарий.

Если вы не можете изменить do_some_things, вам будет трудно.Вы можете поставить свою работу в очередь, но если do_some_things когда-либо ожидает возвращаемое значение, то это будет невозможно обеспечить синхронно.Никто не может заблокировать на веб-сокете.- Берги

Я согласился с тем, что проблема не решаема в javascript, если невозможно редактировать функцию do_some_things и хочет получить данные через веб-сокеты.

У меня есть сейчаснашел обходной путь, настроив небольшой http-сервер на том же компьютере, что и сервер websocket, который предоставляет файл 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...