ajax-запрос не ожидает выполнения первого ajax-запроса - я думаю - PullRequest
0 голосов
/ 17 мая 2019

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

Проблема в том, что при вводе новой записи обратная связь на странице не всегда распознает, что была введена новая запись.Если вы обновите страницу, количество откликов пользователей увеличится на 1, и будет отображено новое среднее значение.Поэтому я думаю, что с обработкой асинхронного аспекта jquery что-то не так.

Может кто-нибудь сказать мне, что я делаю неправильно, пожалуйста?

//code about that gets the user's answers from a form
//then the code below

function ajax1() { //put in database
  $.ajax({
    url: "php/newComment.php",
    method: "POST",
    data: ({
      'artwork': artwork,
      'ip': ip,
      'timestamp': timestamp,
      'rank': rank,
      'comment': comment
    }),
    success: function(data) {},
    error: function(jxhr, statusText, err) {}
  });
} //all good here; it works

$.when(ajax1()).done(function() {
  $.ajax({ //fetch the number of responses 
    //and average data from dB
    url: "php/get-averages-number.php",
    method: "POST",
    data: ({
      'artwork': artwork
    }),
    success: function(data) {
      var objArt = jQuery.parseJSON(data);
      for (i = 0; i < objArt.length; i++) {
        if (artwork == objArt[i].artwork) {
          $('#' + artwork + '-respondents').text(objArt[i].num + " respondent(s) so far");
          var score = parseFloat(objArt[i].avg);
          var rounded = Math.round(score * 10) / 10;
          $('#' + artwork + '-average').text(rounded.toFixed(1) + " average score");
        }
      }
    },
    error: function(jxhr, statusText, err) {}
  }); //this works, but doesn't always reflect that
  //a new response was just entered
});

1 Ответ

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

Проблема в том, что ваша функция ajax1() не возвращает обещание (или вообще ничего), поэтому done() срабатывает немедленно.

Чтобы это исправить, верните объект jqXHR из $.ajax() in ajax1() в вызов $.when(), добавив ключевое слово return:

function ajax1() { 
  return $.ajax({ // add return here
    // ajax settings...
  });
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...