2017-01-18 2 views
-2

Я хочу исправить код на JQuery, который открывает всплывающий официант, выполняет загрузку ajax, а затем закрывает всплывающие окна. Первая версия была такова:как выполнить функцию один за другим

$("#SearchInfo").click(function() { 
    alert("1.Start function. Open waiter popup"); 
    OpenWaiterDialog(); 
    alert("2.Start execution ajax request"); 

     $.ajax({ 
      type: "GET", 
      url: "/searchParameterInBuildDefinition/SearchInfoByBuilds?nameTeamProject=" + $("#SelectorProjectForSearch").val() + "&searchmessage=" + $("#searchmessage").val(), 
      data: "", 
      async: false, 
      success: function (response) { 
       var output = ""; 
       $.each(response, function (i, item) { 
        //console.log("======================"); 
        //console.log("Id:" + response[i]);     
        output += "<tr><td>" + response[i] + "</td></tr>"; 
       }); 
       $("#TableTestCases").show(); 
       $('#BodyTable').html(output); 
      }, 
      dataType: "json"//set to JSON 

     }) 

    alert("3.Request finish. Close popup"); 

    CloseWaiterDialog(); 
}); 

Когда я выполнить эту функцию, браузер заморожена (Microsoft Грань), а также после получения данных АЯКСА, покажите мне сообщение 3,1,2.

Я попытался короткую функцию:

 $.when($.when(OpenWaiterDialog()).then(SearchInfoInBuildDefinition())).then(CloseWaiterDialog()); 

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

+1

Почему бы не поместить ваш CloseWaiterDialog в функцию успеха вашего вызова ajax и сделать асинхронным? – user1628733

+2

1) удалить свойство 'async: false'. Это действительно плохая практика. Если вы проверите консоль, браузер даже скажет вам не использовать ее. 2) Поместите 'alert ('3 ...')' и 'CloseWaiterDialog()' call * внутри * обратный вызов 'success'. –

ответ

1

Не нужно использовать async:false, просто подключите CloseWaiterDialog к запуску в .always() вызова ajax.

$("#SearchInfo").click(function() { 
    OpenWaiterDialog(); 

    $.ajax({ 
     type: "GET", 
     url: "/searchParameterInBuildDefinition/SearchInfoByBuilds?nameTeamProject=" + $("#SelectorProjectForSearch").val() + "&searchmessage=" + $("#searchmessage").val(), 
     data: "",, 
     dataType: "json"//set to JSON 
    }).then(function (response) { 
     var output = ""; 
     $.each(response, function (i, item) { 
      //console.log("======================"); 
      //console.log("Id:" + response[i]);     
      output += "<tr><td>" + response[i] + "</td></tr>"; 
     }); 
     $("#TableTestCases").show(); 
     $('#BodyTable').html(output); 
    }).always(function(){ 
     CloseWaiterDialog(); 
    }); 
}); 
+0

Спасибо. Это работает для меня. –

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