Цикл событий и синхронная блокировка

Мой ответ идет почти в той же строке, что и @janki, но я хотел бы немного изменить фрагмент кода, как показано ниже:

if (wsObject.getFoo() != null && wsObject.getFoo().getBar() != null && wsObject.getFoo().getBar().getBaz() != null) 
   return wsObject.getFoo().getBar().getBaz().getInt();
else
   return something or throw exception;

Вы также можете добавить нулевую проверку для wsObject , если есть вероятность, что этот объект будет null.

2
задан Jack Bashford 30 March 2019 в 22:38
поделиться

1 ответ

Позвольте мне поделиться своими выводами со следующим слегка измененным кодом HTML / JS.

  1. Версия Chromium 73.0.3683.75 (сборка openSUSE) (64-разрядная версия) работает как положено.
  2. Firefox Developer Edition 67b6 (64-разрядная версия) иногда работает как ожидалось.
  3. Firefox Stable Quantum 60.6.1 ESR (64-разрядная версия) по-прежнему не работает должным образом.

Однако, если вы перейдете на задержку const delayBlocking = 50 миллисекунд, в браузере Firefox Stable Quantum 60.6.1 ESR также будет отображено «Блокирование ...».

Моя интерпретация (согласно тому, что Марк сказал в комментарии), что браузеру нужно дать время для обновления DOM. Браузер должен иметь возможность отображать хотя бы один кадр, показывающий сообщение о состоянии «Блокировка ...», отображаемое до перехода в заблокированное состояние (здесь в течение 5 секунд). Это можно сделать с помощью подходящего настроенного setTimeout, как показано ниже. - С уважением, М.

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Document</title>
</head>
<body>
    <a id="block" href="#">Block</a>
    <div id="statusMessage"></div>
    <button>Click me!</button>

    <script>
     document.getElementById('block')
             .addEventListener('click', doBlock);

     function doBlock(event) {
         setStatus('Blocking...');

         // Introducing some ...
         const delayBlocking = 0;

         setTimeout(function() {
             sleep(5000);
             setStatus('Done');
         }, delayBlocking);
     }

     function sleep(milliseconds) {
         const start = Date.now();
         while ((Date.now() - start) < milliseconds);
     }

     function setStatus(status) {
         document.getElementById('statusMessage')
                 .textContent = status;
     }
    </script>

</body>
</html>
0
ответ дан Micha 30 March 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: