Как лучше всего дождаться завершения jquery ajax get JSON, если многие функции полагаются на ответ? - PullRequest
0 голосов
/ 07 августа 2020

tl; dr

Как лучше всего дождаться завершения $ .get JSON перед выполнением остальной части кода, если это не одна функция, а множество которые полагаются на ответ?

Более подробное объяснение:

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

До сих пор я извлекал данные из базы данных в php и просто повторил их в полях ввода, а затем прочитал их в js. Но с увеличением числа переменных, передаваемых таким образом, это становится громоздким и не очень элегантным. У меня есть большинство данных, доступных в объектах, и вставка их переменных-членов в поля ввода кажется ... неуклюжей.

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

Проблема: Я столкнулся с проблемами состояния гонки. Часть моего кода, который полагается на данные, запрошенные get JSON, выполняется до завершения запроса. И это нарушает работу всего приложения. Я уже немного исследовал и теперь знаю, что есть несколько способов решить эту проблему, однако у меня нет опыта, чтобы судить, какой подход мне следует выбрать.

  1. Используйте async: false, это все еще работает и работает. вероятно, самая простая вещь для реализации, но она отмечена как устаревшая, и поэтому я не решаюсь ее использовать.
  2. Помещение всего в обработчик успеха, например
    $.getJSON("../sender.php", params, function (result) {
        //my whole application
    });
Используйте обещания. Если я правильно понимаю, это означает, что мне нужно обернуть $.when( req1, req2, req3 ).done( ... ) каждую функцию, в которой я использую запрошенное значение. Это не кажется хорошим для читабельности, и я узнал, что чистый, читаемый код обычно лучше, чем сложный конструкции. Используйте синхронный запрос, например
    var request = new XMLHttpRequest();
        request.open('GET', '../sender.php', false);
        request.send(params);

    if (request.status === 200) {
        //fill the variables with the returned values
    }
Что-то еще? Это только самые распространенные решения, которые я нашел, вероятно, есть другие возможности, как это сделать. Благодарю за каждое предложение!

1 Ответ

1 голос
/ 07 августа 2020

Поскольку ajax является асинхронным запросом ajax метод не будет ждать выполнения другого метода Наилучшая практика для вызова зависимых методов будет успешным при вызове ajax Он будет выполнять / вызывать функцию только после получения ajax ответа . Вы можете сделать запрос различными способами

  1. использовать традиционный метод или отключить асинхронный запрос ajax
  2. сделать ajax очередь и обслуживать один запрос другим при получении ответа - вы может сохранять там статус и запускать их каждую секунду, используя функцию timeinterval, которая будет hecti c.

Я предлагаю вам go с 1, поскольку асинхронный запрос может быть обработан как синхронный с помощью asyn c: «ложь»

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