Действительно ли возможно заставить окно браузера обновлять, в то время как это находится в цикле JavaScript?

У меня есть вызов Ajax, который в настоящее время должен быть синхронным. Однако, в то время как этот вызов Ajax выполняется, замораживания интерфейса браузера, до возвратов вызова. В случаях тайм-аута это может заморозить браузер в течение значительного промежутка времени.

Там какой-либо путь состоит в том, чтобы заставить браузер (какой-либо браузер) обновлять пользовательский интерфейс, но не выполнять какой-либо JavaScript? Идеально это была бы некоторая команда как window.update(), который позволил бы пользовательскому интерфейсу распараллелить обновление.

Если это было бы возможно, то я мог заменить синхронный вызов Ajax чем-то как:

obj = do_async_ajax_call();
while (!obj.hasReturned()) {
  window.update();
}
// synchronous call can resume

Причина, что я не могу использовать setTimeout, или возобновите функцию в обратном вызове, то, что поток выполнения не может быть прерван: (существует слишком много переменных состояния, что все зависят друг от друга, и long_function() поток должен был бы иначе быть возобновлен так или иначе):

function long_function() {
   // lots of code, reads/writes variable 'a', 'b', ...
   if (sync_call_is_true()) {
     // lots of code, reads/writes variable 'a', 'b', ...
   } else {
     // lots of code, reads/writes variable 'a', 'b', ...
   }
   // lots of code, reads/writes variable 'a', 'b', ...
   return calculated_value;
}

6
задан jevon 3 February 2010 в 00:51
поделиться

4 ответа

Для начала можно использовать библиотеки тэгов. Можно использовать стандартную библиотеку тэга JSTL для выполнения большинства общих задач, для которых нужны скрипты. Существует много других более богатых библиотек тэгов, которые используются, как в рамке struts2 или apache.

например.

  <c:if test="${your condition}">
       Your Content
  </c:if>

заменит ваши утверждения.

-121--2526269-

Предпочтительной альтернативой скриптлетам является язык выражения JSTL; здесь - хороший обзор. Вам нужно будет добавить tallib так:

<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>

В качестве примера, JSTL предоставляет кучу неявных объектов, которые дают вам материал, который вам нужен; требуется pageContext.request .

Таким образом, можно заменить <% request.getRequestURI% > на $ {pageContext.request.requestURI} .

Можно выполнить условия с помощью < c: if > тэги.

-121--2526270-

Необходимо заменить синхронный запрос асинхронным запросом и использовать обратный вызов. Упрощенный пример:

obj = do_async_ajax_call(function (data, success)
{
    if (success) 
    {  
        // continue...  
    } 
}); 

function do_async_ajax_call(callback)
{
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://mysite.com", true);
    xhr.onreadystatechange = function ()
    {
        if (xhr.readyState == 4 && xhr.status == 200)
            callback(xhr.responseXML, true);
        else if (xhr.readyState == 4)
            callback(null, false);
    }
    xhr.send();
}

Таким образом вы передаете анонимную функцию в качестве параметра функции запроса ajax. Когда ajax завершен, переданная функция вызывается с переданным ему responseXML. Тем временем браузер был свободен делать это обычно до завершения вызова. Отсюда, остальная часть вашего кода продолжается.

3
ответ дан 17 December 2019 в 18:15
поделиться

Асинхронный Ajax Fetch затем Settimeout и выполняет обработку работы в кусках (срабатывает обратный вызов)

0
ответ дан 17 December 2019 в 18:15
поделиться

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

0
ответ дан 17 December 2019 в 18:15
поделиться

JavaScript является однопоточным. Таким образом, по определению, вы не можете обновлять пользовательский интерфейс, пока находитесь в приливной петле. Однако, начиная с Firefox 3.5, добавлена ​​поддержка многопоточных сценариев JavaScripts, называемых веб-рабочими. Веб-воркеры не могут влиять на пользовательский интерфейс страницы, но они также не будут блокировать обновления пользовательского интерфейса. Мы, работники, также поддерживаемся Chrome и Safari.
Проблема в том, что даже если вы переместите вызов AJAX в фоновый поток и дождитесь завершения его выполнения, пользователи смогут нажимать кнопки и изменять значения в вашем пользовательском интерфейсе (и насколько я поймите, это то, чего вы пытаетесь избежать). Единственное, что я могу предложить для предотвращения того, чтобы пользователи вызывали какие-либо изменения, - это счетчик, который блокирует весь пользовательский интерфейс и не разрешает никакого взаимодействия со страницей до тех пор, пока веб-вызов не вернется.

0
ответ дан 17 December 2019 в 18:15
поделиться
Другие вопросы по тегам:

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