Подтвердить что ты не робот

GetJSON Synchronous

ЦЕЛЬ: Мне нужно получить данные из базы данных и обновить main.php(более очевидно через draw_polygon) каждый раз, когда что-то добавляется в базу данных (после $.ajax to submit_to_db.php).

Итак, в основном у меня есть main.php, который будет ajax вызывать другой php для получения массива, который будет сохранен в базе данных, а json-вызов другого php для возврата массива будет использоваться main.php.

$(document).ready(function() {
    get_from_db();
    $('#button_cancel').click(function(){
       $.ajax({
          url: 'submit_to_db.php',
          type: 'POST',
          data: {list_item: selected_from_list},

          success: function(result){
             ...
             get_from_db();
          }
       });
    });
    function get_from_db(){
         $.getJSON('get_from_db.php', function(data) {
             ...
             draw_polygon(data);
         });
    }
 });

В моем случае, что я сделал, это вызов функции get_from_db для getJSON, чтобы фактически получить данные из базы данных с данными, которые будут использоваться для draw_polygon. Но как это должно быть сделано? Я полный новичок, и это мой первый раз попробовать getJSON и ajax, если честно. Итак, мой вопрос: как работает асинхронная работа? Есть ли другой способ обхода этого решения вместо того, чтобы вызвать функцию get_from_db с getJSON (это не синхронно, не так ли? Почему он не обновляет страницу, когда она не входит в функцию?) Все время - как $.ajax с async: false (кстати, я не мог заставить его работать). Мой подход работает, но я подумал, что, возможно, есть и другие способы сделать это. Мне бы хотелось узнать, как это сделать. Заранее спасибо. Надеюсь, у меня есть смысл.

Чтобы сделать его более понятным, вот чего я хочу достичь:

  • @start страницы, получить данные из базы данных (в настоящее время через getJSON)
  • Покрасьте или нарисуйте canvas с помощью data
  • Когда я нажимаю кнопку "Готово", она обновляет базу данных
  • Я хочу, чтобы АВТОМАТИЧЕСКИ снова получить данные, чтобы перерисовать изменения в холсте.
4b9b3361

Ответ 1

Асинхронно означает, что запрос выполняется в фоновом режиме и вызывает вашу функцию, когда она получила ответ. Этот метод лучше всего, если вы хотите получить результат, но разрешите использовать приложение в запросе. Если вы хотите получить прямой ответ, взгляните на запрос синхронизации. этот запрос приостанавливает выполнение script до тех пор, пока не получит ответ, и пользователь не сможет ничего сделать, пока не будет получен ответ. Вы можете переключать его через:

async: false,

Итак, например:

$.ajax({
    url: "myurl",
    async: false,
    ...
})

Ответ 2

Так как $.getJSON() использует ajax-конфигурации, просто установите глобальные конфигурации ajax:

// Set the global configs to synchronous 
$.ajaxSetup({
    async: false
});

// Your $.getJSON() request is now synchronous...

// Set the global configs back to asynchronous 
$.ajaxSetup({
    async: true
});

Ответ 3

$. getJSON(), не принимает конфигурацию, как сказано в документах, это сокращенная версия:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

Так что просто перепишите свой запрос с точки зрения этого, и async: false будет работать так, как вы ожидаете.

Ответ 4

$.getJSON() - сокращенное обозначение для $.ajax(), которое может быть сконфигурировано как синхронное (см. jQuery.getJSON и JQuery.ajax):

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  async: false, 
  success: function(data) {
      ...
      draw_polygon(data);
  }
});

Попробуйте избежать синхронных вызовов. Цитата из jQuery doc (см. Async prop):

Запросы междоменных и dataType: запросы "jsonp" не поддерживают синхронная работа. Обратите внимание, что синхронные запросы могут временно заблокируйте браузер, отключив любые действия, пока запрос активен.

Возможно, вы захотите попробовать jQuery Отложить следующим образом:

var jqxhr = $.getJSON(url);
jqxhr.done(function(data) {
    ...
    draw_polygon(data);
});