Установка переменной вне запроса $.get, jQuery

#jquery

#jquery

Вопрос:

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

Вот мой код:

 $(document).ready(function() {
            var totalPages
            var currentPage = 1;
            //this $.get returns a number
            $.get('getTotalPages.php', function(data) {
                totalPages = data;
            });
            //just an example of applying the result to something else
            if (currentPage < totalPages) {
               ... do something...
            }
        });
  

Есть идеи?

Ответ №1:

$.get() Оператор является асинхронным. Это означает, что он не завершается немедленно, но вы пытаетесь немедленно использовать возвращаемое значение TotalPages . Фактически, вы не можете использовать данные, которые он возвращает, пока не будет вызван обработчик успеха. В вашем примере вы запускаете $.get() команду (которая просто запускает ее), а затем сразу же используете totalPages , но totalPages еще не была установлена, потому $.get() что еще не завершена, поэтому обработчик успеха, который устанавливает totalPages , еще не был вызван.

Любая работа, в которой используется ответ из $.get() , должна выполняться в самом обработчике успеха (или функциях, которые он вызывает), потому что только тогда вы знаете, что результат доступен.

Измените свой код на это, чтобы увидеть, как он работает (при условии, что ваш get() действительно работает:

 $(document).ready(function() {
    var totalPages;
    //this $.get returns a number
    $.get('getTotalPages.php', function(data) {
        totalPages = data;
        //just an example of applying the result to something else
        if (currentPage < totalPages) {
           ... do something...
        }
    });
    // code executed here will execute before the $.get() command has completed
});
  

Комментарии:

1. Изменение текста было плохим примером, я должен был вдаваться в подробности. Мне нужно передать количество страниц (возвращаемых $.get , if...else дальше по строке

2. Вы не можете закодировать это таким образом. Вы должны продолжить обработку $.get() результата из самого обработчика успеха или других функций, которые вы вызываете из обработчика успеха. Вы должны структурировать свой код для работы с асинхронными вызовами ajax. Вы не можете выполнять последовательное программирование, как вы пытались сделать с asychronous ajax.

3. Я изменил код в своем ответе, чтобы показать вам, куда if должен идти оператор.

Ответ №2:

Я думаю, вы ищете это:

$.get() является асинхронным, но это всего лишь сокращение для полной функции $.ajax(), которую вы можете установить синхронной и легко получить свойство responseText .

 $(document).ready(function() {
  var totalPages;

  totalPages = $.ajax({
    url: 'getTotalPages.php',
    async: false
  }).responseText;
});
  

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

Комментарии:

1. Однако это всего лишь короткий путь для использования обработчика успеха, и это не причина, по которой асинхронность была предоставлена в первую очередь. Не лучшая практика и в области, в которой так мало возможностей для загрузки.

2. Я пытаюсь преобразовать довольно сложный разбитый на страницы результирующий набор (длинная история) в JSON. Мне просто нужно было общее количество страниц для разбитых на страницы результатов, чтобы знать, когда показывать или скрывать предыдущие и следующие ссылки. getTotalPages.php Файл возвращает общее количество страниц на основе количества строк в таблице и количества строк на странице. Будет ли приведенное выше приемлемым решением? Кажется, работает .. 🙂

Ответ №3:

Это должно быть сделано, когда браузер получает запрос ajax обратно к нему. Метод $.get сообщает вам об этом на основе функции успеха

 $.get(
{
   'url' : 'someUrl.html',
   'success' : function(data)
   {
       totalPages = data;
       if( totalPages == 1 ) //do stuff
       else            // do other stuff
   }
});
  

или просто создайте функцию снаружи и напишите ‘success’: functionName . В любом случае ее нужно обработать, как упоминалось выше, но я не видел в коде, после того, как ответ пришел с сервера.