2010-07-28 3 views
1

Я вызываю метод WebService асинхронно.ASP.NET Проблема с jQuery и методом WebService

Хотя метод не является полным, я использую это JQuery код, чтобы обновить свой прогресс бар (получить значение прогресса от этого WebService)

var intervalID = setInterval(updateProgress, 1000); 

    function updateProgress() { 

      $.ajax({ 
       type: "GET", 
       url: "myPage.aspx/GetProgress", 
       data: "{}", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       async: true, 
       success: function(msg) { 
        $("#result").text = msg.d; 
        var value = $("#progressbar").progressbar("option", "value"); 
        if (value < 100) { 
         $("#progressbar").progressbar("value", msg.d); 
         $("#result").text(msg.d); 
        } 
        else { 
         clearInterval(intervalID); 
        } 
       } 
      }); 

Проблема заключается в том, что браузер посылает запросы (скажем, 15 раз), чтобы получить значение прогресса, но запросы ждут, пока асинхронный метод завершен. Затем мой сервер отправляет в 15 раз это значение для браузера.

Почему запросы ждут завершения асинхронного метода?

ответ

1

При установке async: true вы рассказываете запросы завершить последовательно и заблокировать браузер при этом. Если вы хотите, чтобы пользовательский интерфейс обновлялся, вам нужно установить тайм-аут вместо интервала, поэтому пользовательский интерфейс имеет время для обновления между запросами, но лучше было бы отключить async и использовать вместо этого setTimeout(), вот что я имею в виду:

function updateProgress() { 
    $.ajax({ 
     type: "GET", 
     url: "myPage.aspx/GetProgress", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(msg) { 
      $("#result").text = msg.d; 
      var value = $("#progressbar").progressbar("option", "value"); 
      if (value < 100) { 
       $("#progressbar").progressbar("value", msg.d); 
       $("#result").text(msg.d); 
      } 
      else { 
       setTimeout(updateProgress, 1000); 
      } 
     } 
    }); 
} 

Это позволяет запрос полный, не запирать браузер или UI нить, и начинает следующий запрос, когда первый заканчивается, с 1000 мс задержки, просто отрегулируйте при необходимости. В противном случае говорят, что пользователь имеет задержку в 1200 мс, в настоящее время вы ставите очередные запросы, которые перекрываются ... Лучше всего не использовать setInterval() в повторяющейся ситуации AJAX, так как вы не знаете, сколько времени займет сам запрос.

+0

так что бы вы передумали вместо setInterval(), чтобы проверить этот прогресс? – Tony

+0

Боюсь, что тоже не работает – Tony

+0

@Tony - Что не работает? «Это не работает» - это не очень полезное описание, будьте конкретны в том, что работает/не работает :) –