Промисы в Jquery ( помогите понять принцип )

151
01 июля 2019, 12:50

Как сделать, что бы обещание срабатывало при выполнении всего содержимого first(); Если добавить в массив сразу AJAX запрос, то всё работает как требуется. Но если first(), то ответа от AJAX не дожидается, что и логично.

const arr = []; 
function first (i) { 
  $.ajax({ 
    url: `http://jsonplaceholder.typicode.com/users/${i}`, 
    type: 'POST', 
    data: { 
      i: i 
    }, 
    complete: function() { 
      console.log('AJAX №' + i); 
    } 
  }) 
}; 
 
for (let i = 1; i < 6; i++) { 
  arr.push(  
    first(i) 
  ); 
} 
 
Promise.all(arr) 
  .then(resolve => { 
    console.log('После AJAX'); 
  }) 
  .catch(reject => { 
 
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Answer 1
function first (i) {
  return $.ajax({ ...
Answer 2

complete срабатывает после "отработки" всех остальных функций ajax.
Т.е и после события, которое перехватывает then в Promise.all()
Может быть не самый элегантный способ - обернуть вызов ajax в еще один Promise.

const arr = []; 
function first (i) { 
  return new Promise(function(resolve, reject) { 
    $.ajax({ 
      url: `http://jsonplaceholder.typicode.com/users/${i}`, 
      type: 'GET', 
      data: { 
        i: i 
      }, 
      complete: function(data) { 
        console.log('AJAX №' + i); 
        resolve(data); 
      }, 
      error: function(err) { 
        console.log(err); 
        reject(err); 
      } 
    }); 
  }); 
}; 
 
for (let i = 1; i < 6; i++) { 
  arr.push(  
    first(i) 
  ); 
} 
 
Promise.all(arr) 
  .then(resolve => { 
    console.log('После AJAX'); 
  }) 
  .catch(reject => { 
 
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

READ ALSO
Есть массив объектов, как проверить есть ли в объектах пустые значения?

Есть массив объектов, как проверить есть ли в объектах пустые значения?

Есть массив объектов, как проверить есть ли в объектах пустые значения? Массив такого вида:

174
Как сделать сайт авторизации?Помогите

Как сделать сайт авторизации?Помогите

У меня есть страница И я не могу понять как сделать так чтобы когда ПРАВИЛЬНЫЙ логин и пароль,переходил на другую страницуА когда не правильный...

153
Почему не работает на jquery

Почему не работает на jquery

если добавить вместо styledisplay='block' show(), то не работает

160