Вопрос по sleep, javascript, wait – Javascript: неблокирующий способ ожидания, пока условие не выполнится

7

У меня есть несколько ASP.NET UpdatePanels, каждый с AsyncPostBackTrigger, привязанный к той же кнопке 'Событие щелчка на сервере. Поскольку только одна UpdatePanel может делать свое дело одновременно, я использую.get_isInAsyncPostBack() изPageRequestManager запретить пользователю доступ к другой части страницы, пока не завершится асинхронная обратная передача.

Другая часть этой страницы должна динамически обновлять несколько панелей обновления последовательно. Поскольку панели обновления используют асинхронные триггеры, вызывая__doPostBack("", 'PanelId'); стреляет асинхронно. Из-за этого он быстро перейдет к следующей итерации цикла и попытается обновить следующую панель. Однако вторая итерация завершается неудачно, потому что уже есть другая панель обновлений, выполняющая асинхронную обратную передачу.

В идеале был бы способ подождать, пока.get_isInAsyncPostBack() возвращает false, не блокируя другие действия клиента.

Исследования привели меня ко многим людям с моей проблемой, почти всем из которых рекомендуется использоватьsetTimeOut(), Я не думаю, что это будет работать для меня. Я нене хочу ждать указанное количество времени перед выполнением функции. Я просто хочу, чтобы мой Javascript ждал, пока запущен другой скрипт, желательно подождать, пока не выполнится определенное условие.

Я понимаю, что многие, вероятно, захотят предложить мне пересмотреть свою модель. Это'На самом деле это не моя модель, а та, что была передана нашей команде разработчиков, и в настоящее время она находится в полном беспорядке. Из-за нехватки времени переписать модель нельзя. Единственный вариант - заставить это работать. Я думаю, что если бы у меня был способ заставить клиентский код ждать без блокировки, моя проблема была бы решена.

Хороший вопрос. Я нашел его, когда пытался написать два. pylover
Тот'Просто не так, как работает JavaScript. Он будет выполнять весь код синхронно. HTML5s круто новыйВеб-работники может помочь, но в остальном тыУ меня не будет выбора, кроме как использовать /.setTimeoutsetInterval user2428118

Ваш Ответ

4   ответа
1

wait = (seconds) => 
   new Promise(resolve => 
      setTimeout(() => resolve(true), seconds * 1000)
   );

И вы можете использовать это так.

doWork = async() => {
   if(await this.wait(3)) {
       // After 3 seconds do something...
   }
}
13

Это'легко сделать ошибку при звонкеsetTimeout это приведет к заполнению стека вызовов JavaScript. Если ваша функция имеет параметры, вы должны передать их в концеsetTimeout список параметров вот так:

function wait(param1, param2){
  if (!condition){
    setTimeout(wait, 100, param1, param2);
  } else {
    // CODE GOES IN HERE
  }
}

Если вы передадите параметры или даже включите empty () после имени функции, она будет выполнена немедленно и заполнит стек.

// This is the wrong way to do it!    
function wait(param1, param2){
  if (!condition){
    setTimeout(wait(param1, param2), 100); // you'll get max call stack error if you do this!
  } else {
    // CODE GOES IN HERE
  }
}
2

которая должна возвращать true при выполнении условия. Когда это происходит, вызывается readyFunc. checkInterval устанавливает скорость проверки в миллисекундах

       var wait = function(condFunc, readyFunc, checkInterval) {
            var checkFunc = function() {
                if(condFunc()) {
                    readyFunc(); 
                }
                else
                {
                    setTimeout(checkFunc, checkInterval);
                }
            };
            checkFunc();
        };

Использование:

       wait(
            function() { return new Date().getSeconds() == 10; }, 
            function() { console.log("Done"); },
            100
        );

принты "Готово" когда текущее время составляет 10 секунд после минуты

28

как ожидание или сон, поскольку браузер не отвечает на запросы.

В вашем случае я бы пошел с чем-то похожим на следующее:

function wait(){
  if (!condition){
    setTimeout(wait,100);
  } else {
    // CODE GOES IN HERE
  }
}
Концепция установки таймаута отличается, она не останавливает выполнение кода, а выполняет код через некоторое время. Нет способа (по крайней мере, хорошо) приостановить сценарий. Вам придется заменить ... КОД ИДЕТ ЗДЕСЬ ... на логику, которая должна быть выполнена после выполнения условия Marian Bazalik
Как насчет максимального размера стека вызовов в JavaScript? pylover
Я не уверен, как это должно работать. Когда я выполняю этот код "setTimeout(function () { alert("waiting"); }, 5000); alert("donewaiting");donewaiting» сначала предупреждается, а затем "ожидания» 5 секунд спустя. Какие'Точка ожидания, если этопросто собираетесь сразу перейти к следующей строке кода? oscilatingcretin
@pylover используяsetTimeout не должен влиять на стек вызовов, потому что он не• выполнить функцию еще раз, пока текущая функция не будет завершена. Это можно сделать неправильно. Я'Я добавлю ответ, чтобы покрыть это. CoderDennis
Это 'опрос» техника по сути работаетwait функционировать каждые 100 мс доcondition становитсяtrue, Для ваших целей я бы заменилcondition здесь с.get_isInAsyncPostBack() а также...CODE GOES IN HERE... с вызовом для обновления следующей панели, а затемwait для следующей панели. Вы'захочу новыйwait() функция для каждой панели (например,waitForPanel1()waitForPanel2(), так далее. Heretic Monkey

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