Как создать очередь ajax запросов? [дубликат]

238
15 октября 2018, 00:50

На данный вопрос уже ответили:

  • Как последовательно вызвать асинхронную функцию с коллбеками? 2 ответа

Допустим есть объект url адресов, нужно циклично по ним пройтись, но нужно ждать пока не пришел ответ в предыдущего, с интервалом 5 секунд

<button>Запустить</button> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<script> 
$(document).ready(function(){ 
  var urls = { 
    1: {url: 'https://google.com/'}, 
    2: {url: 'https://yandex.com/'}, 
    3: {url: 'https://yahoo.com/'} 
  }; 
 
  function getUrl(){ 
    $.each(urls, function(i, elem){ 
      $.ajax({ 
        url: elem.url, 
        beforeSend: function(){ 
          console.log('Получение ответа от: '+ elem.url +' ...'); 
        } 
      }) 
      .always(function(data){ 
        console.log('Получен ответ от: '+ elem.url); 
      }); 
      setTimeout(function(){}, 5000); 
    }); 
  } 
 
  $("button").on('click', function(){ 
    getUrl(); 
  }); 
}); 
</script>

Должно быть так

Получение ответа от: https://google.com/ ...
Получен ответ от: https://google.com/
// ждем 5 секунд
Получение ответа от: https://yandex.com/ ...
Получен ответ от: https://yandex.com/
// ждем 5 секунд
Получение ответа от: https://yahoo.com/ ...
Получен ответ от: https://yahoo.com/

А выводит это все сразу, нет ожидания 5 секунд:

Получение ответа от: https://google.com/ ...
Получение ответа от: https://yandex.com/ ...
Получение ответа от: https://yahoo.com/ ...
Получен ответ от: https://google.com/
Получен ответ от: https://yandex.com/
Получен ответ от: https://yahoo.com/
Answer 1

<button>Запустить</button> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<script> 
  $(document).ready(function() { 
    var urls = { 
      1: { url: 'https://google.com/' }, 
      2: { url: 'https://yandex.com/' }, 
      3: { url: 'https://yahoo.com/' } 
    }; 
 
    function getUrls() { 
      var keys = Object.keys(urls); 
      getOneUrl(0); 
       
      function getOneUrl(index) { 
        $.ajax({ 
            url: urls[keys[index]].url, 
            beforeSend: function() { 
              console.log('Получение ответа от: ' + urls[keys[index]].url + ' ...'); 
            } 
          }) 
          .always(function(data) { 
            console.log('Получен ответ от: ' + urls[keys[index]].url); 
            if (index < keys.length - 1) { 
              console.log("ждем 5 секунд"); 
              setTimeout(getOneUrl, 5000, index + 1); 
            } 
          }); 
      } 
    } 
 
    $("button").on('click', function() { 
      getUrls(); 
    }); 
  }); 
</script>

Answer 2

<button>Запустить</button> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<script> 
  $(document).ready(function() { 
    var urls = { 
      1: { url: 'https://google.com/' }, 
      2: { url: 'https://yandex.com/' }, 
      3: { url: 'https://yahoo.com/' } 
    }; 
 
    var size = Object.keys(urls).length; 
 
 function getUrl(){ 
 
    $.each(urls, function(i, elem){ 
 
    setTimeout(function(){ 
      $.ajax({ 
        url: elem.url, 
        beforeSend: function(){ 
          console.log('Получение ответа от: '+ elem.url +' ...'); 
        } 
      }) 
      .always(function(data){ 
        console.log('Получен ответ от: '+ elem.url); 
        if (i < size) 
          console.log("ждем 5 секунд"); 
        else 
          console.log("Конец"); 
      }); 
       
    }, 5000*(i-1)); 
    }); 
    
  } 
    $("button").on('click', function() { 
      getUrl(); 
    }); 
  }); 
</script>

READ ALSO
Установить фон на canvas

Установить фон на canvas

Имеется изображение фона 50 на 50 px и холст размером 500 на 500, нужно изображениями фона заполнить весь холстКак это сделать?

219
JavaScript сравнение чисел в виде строки

JavaScript сравнение чисел в виде строки

Сижу и пишу условие на Vuejs

170
Помощь в выборе литературы

Помощь в выборе литературы

Нужна помощь в выборе книги, по которой можно (если это возможно) изучить front-end часть веб-программированияВ идеале в объеме, позволяющем претендовать...

181
Сортировка вложенного массива в mongose

Сортировка вложенного массива в mongose

есть такая модель https://pastebincom/i01Pw1Un и есть такой запрос https://pastebin

180