2016-12-30 4 views
0

Я не уверен, что я делаю что-то не так, на самом деле не использовал его в JS, но я бы хотел проверить каждые 5 секунд, если строка существует в db с вызовом ajax, пока условие не выполняется.javascript do while зависает и делает браузер не в памяти

Это мой призыв:

var checkForDoc = false; 
      var i = 0; 
      do { 
       $timeout(function() { 
        $http({ 
         url: 'http://localhost:52876/api/Admin/CheckForDoc', 
         method: "POST", 
         async: false, 
         params: { loanID: $scope.loanIdPopup } 
        }).success(function (data, status) { 
         if (data === 'OK') { 
          checkForDoc = true; 
         } 
         else{ 
          i++; 
         } 

         if (i == 23) { 
          checkForDoc = true; 
         } 
        }).error(function (data, status) { 
         console.log(data); 
        }); 
       }, 5000); 

      } while (!checkForDoc); 

      if (checkForDoc) { 
       $uibModalInstance.close(); 
      } 

Так что я хотел бы проверить каждые 5 секунд, если запись существует в БД и если он установлен в checkForDoc истина, которая закрывает модальное всплывающее окно. В случае, если строка не существует через 2 минуты, я также закрою всплывающее окно, но, как я уже сказал, когда я дойду до строки do в отладчике, браузер перестает отвечать, и через некоторое время я получаю это сообщение enter image description here

Спасибо и счастливых праздники всех

+0

В качестве побочного примечания я обнаружил, что всегда полезно добавить переменную «проверка работоспособности» всякий раз, когда я делаю цикл while. 'while (независимо) {sanityCheck ++; if (sanityCheck> 100) отладчик; * остаток цикла *} '. Эта практика может помочь спасти вас от сбоев браузера И делает паузы в правильном месте проблемы, поэтому вы можете проверить, что происходит. – machineghost

ответ

1

Если предположить, что это $http() метода углового, он не принимает async свойства на его АЯКС объекта конфигурации. Таким образом, ваш код представляет собой жесткий цикл, запускающий миллион отдельных HTTP-запросов, пока браузер просто не сдастся.

Даже если это сработало, этот подход является довольно ужасной идеей. Синхронный HTTP - плохой пользовательский опыт, потому что браузер в основном зависает во время работы сети. Объект конфигурации $http()делает поддерживает таймаут, и это, вероятно, лучший подход.

+0

Что сказал Pointy !!! – Bindrid

+0

Привет @Pointy thx, он делает то же самое с async равным false. Можете ли вы привести мне пример, как я могу сделать то, что я пытаюсь достичь. Большое спасибо – Laziale

+0

Также у меня есть точка останова в API в этой функции/CheckForDoc, но эта функция вообще не достигнута. Итак, я не уверен, правильно ли написано условие. Еще раз спасибо – Laziale

0

это проверяет условия в .success и, если не выполняется, срабатывает до 5 секунд. (не тестировалось, но вы поняли идею)

   var checkForDoc = false; 
        var i = 0; 

        function doCheck() { 

          $http({ 
           url: 'http://localhost:52876/api/Admin/CheckForDoc', 
           method: "POST", 
           async: true, 
           params: { loanID: $scope.loanIdPopup } 
          }).success(function (data, status) { 
           if (data === 'OK') { 
            if (checkForDoc) { 
             $uibModalInstance.close(); 
            } 
           } 
           else { 
            i++; 

            if (i < 23) { 
             setTimeout(function() { doCheck() }, 5000) 
            } 
           } 
          }).error(function (data, status) { 
           console.log(data); 
          }); 


        } 
        // set first clock 
        setTimeout(function() { doCheck(); }, 5000); 

 Смежные вопросы

  • Нет связанных вопросов^_^