Как я могу назначить приоритеты конкретному вызову ajax? - PullRequest
1 голос
/ 14 мая 2019

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

Следующий скрипт у меня есть

function refresh_ss_one(){
    $.ajax({
       type: 'GET',
       url: "{{ route('RefreshSessionOne') }}",
       data: {}, 
       success: function(response){ 
        console.log(response);
       }
    });
}
function refresh_ss_two(){
    $.ajax({
       type: 'GET',
       url: "{{ route('RefreshSessionTwo') }}",
       data: {}, 
       success: function(response){ 
        console.log(response);
       }
    });
}
setInterval(refresh_ss_one, 10000);
setInterval(refresh_ss_two, 10000);

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

$("#check-rate").submit(function(e) {
    var form_data = $(this);
    $.ajax({
           type: 'POST',
           url: currency_route,
           data: form_data.serialize(), 
           success: function(response)
           {
              ...
           }
         });
    e.preventDefault(); 
});

Может ли кто-нибудь помочь мне, как я могу решить эту проблему ..

Ответы [ 4 ]

0 голосов
/ 14 мая 2019

К последовательно Получите ответы из списка запросов GET / POST, вот как вы можете решить вашу проблему, используя jQuery Deferreds

const $ajaxSeq = arr => $.when.apply($, arr.map(data => $.ajax(data))).then(function(_res){ 
     return Array.isArray(_res) ? [].map.call(arguments, res => res[0]) : [_res];
  });

Используйте как:

$ajaxSeq([
    {type:'POST', url:'some_url_here', data: {content: "Hello world"}},
    {type:'GET',  url:'some_url_here'},
    {type:'GET',  url:'some_url_here'},
]).then( res => {
    // Once all requests are fulfilled
    // access the desired response in order:
    console.log(res[0])
    console.log(res[1])
    console.log(res[2])
});
0 голосов
/ 14 мая 2019

AJAX звонки делают то, что говорят. Это делает запросы асинхронными. Таким образом, по определению 1 запрос не ожидает завершения другого запроса. Вы можете сделать это как async: false, как @jayoti сказал выше. Но более того, у вас должен быть один метод метода, который вызывает другие 2 метода, и вы можете вызвать 2-й метод, когда получите ответ.

0 голосов
/ 14 мая 2019

Я бы попробовал более современный подход. Используйте обещание:

var promise1 = new Promise(function(resolve, reject) {
   //first ajax call here
});

promise1.then((value) => {
//second ajax call here
});

Вот документация

Что обещание сделает, так это обеспечит выполнение первой части вашего кода (ваш первый вызов ajax здесь, и вы можете установить разрешение при успешном вызове ajax, а затем он выполнит второй.

P.S. Вы можете иметь столько их, сколько захотите.

0 голосов
/ 14 мая 2019

вы можете попробовать следующим образом:

<script>
// write your ajax function like
$.ajax({
    type: 'GET',
    url: "{{ route('RefreshSessionOne') }}",
    data: {},
    async: false,
    success: function(response) {
        console.log(response);
    }
});

// Сначала выполните этот запрос, затем перейдите к другим кодам

$.ajax({
    type: 'GET',
    url: "{{ route('RefreshSessionTwo') }}",
    data: {},
    success: function(response) {
        console.log(response);
    }
});

// Выполняется после завершения предыдущей асинхронностиложный запрос.

По умолчанию запрос $ .ajax в jquery установлен на асинхронный.Имя переменной асинхронно, а значение установлено в true.

Или вы можете вызвать вторую функцию в успешной части первой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...