2015-07-03 4 views
0

У меня есть два вызова ajax с использованием jquery. Для первого требуется время около 20 секунд для выполнения, но второе - намного быстрее, должно выполняться в миллисекундах. То, что происходит, - это второй вызов ajax, не заканчивающий выполнение, пока первый не будет завершен, как только первый вызов будет выполнен, второй ajax выполняется быстро. Таким образом, второй аякс вызывается с первым, но он не завершает выполнение, пока первый не будет завершен. Как я могу это исправить?два вызова ajax не выполняются одновременно

Вот мой код:

jQuery(document).ready(function (e) { 
     do_download(); 

    }); 
    function do_download() 
    { 
     $('.status p').text('Fetching the video ...'); 
     var request = $.ajax({ 
      url: "http://www.example.com/download/start", 
      method: "POST", 
      async: true, 
      data: {youtube_url: 'https://www.youtube.com/watch?v=ic7scBTY-xw', 
        access_token :'4b5e0c903eb7b68eb336500cdfc2d11c' 
       } 
      }); 

      request.done(function (msg) { 
       //alert('done'); 


      }); 

      request.fail(function (jqXHR, textStatus) { 
       alert("Request failed: " + textStatus); 
      }); 
    } 


    var get_operation_status_interval = setInterval(get_operation_status, 1000); 

    function get_operation_status() { 
     var url_process_info = "http://www.example.com/download/get_video_status_new/ic7scBTY-xw"; 
     $.ajax({ 
      url: url_process_info, 
      dataType: 'json', 
      async: false, 
      method: "GET", 
      cache: false, 
      success: function(data) { 
       if(data.progress){ 
        $('div.meter span').css('width', data.progress); 
        if(data.progress == '100%' && data.is_file_ready != false){ 
         $('.status p').text('Converting the video ...'); 
        } 
       } 
       if (data.is_file_ready == true) { 
        clearInterval(get_operation_status_interval); 
        $('.status p').text('file is ready !'); 
        $('.download-section').show(); 
       } 
      } 
     }); 

ответ

0

Это состояние гонки. У вас есть это:

do_download: настройка Ajax вызова как асинхронная get_operation_status: настройка Ajax вызова в синхронизации

Итак, первая функция, которую вы называете это «get_operation_status», почему ?? Поскольку do_download будет вызываться, когда документ будет готов, но другая функция будет вызвана раньше, поэтому браузеру требуется время, чтобы документ был готов, тогда первый вызов - «get_operation_status», и эта функция блокирует другие вызовы, потому что это синхронизация вместо async:

// tames some time, it's no inmediately 
jQuery(document).ready(function (e) { 
    do_download(); 
}); 

// this call could be execute before do_download 
var get_operation_status_interval = setInterval(get_operation_status, 1000); 

Положите оба вызова асинхр (никогда никогда не SYNC) и таймер внутри документа готовый как:

jQuery(document).ready(function (e) { 
    do_download(); 
    var get_operation_status_interval = setInterval(get_operation_status, 1000); 
}); 
+0

Я переместил заданный интервал с функцией в документ, как вы упомянули, но все еще не работает, вот снимок от firebug http://screencast.com/ t/fYdn7W5b – Kamal

+0

Вот моментальный снимок, когда я установил два вызова async = true, второй ajax был вызван много раз, но никто не выполнялся до тех пор, пока do_download не будет выполнен. http://screencast.com/t/qnxwmVVGov – Kamal

+0

Хорошо, один вопрос, используете ли вы какое-то предупреждение в своем коде? Попробуйте удалить все функции «alert», потому что это функция синхронизации и заблокировать основной поток javascript. –

0

Ваш второй один является асинхронной ложь. Измените его на true. (Или полностью удалите его)

+0

Я установил второй вызов async: false, он вызывает его несколько раз, но ни один из выполненных вызовов не выполняется до первого вызова – Kamal

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