jQuery — задержка обработки if / else до завершения вызова «.get»

#jquery #ajax

#jquery #ajax

Вопрос:

У меня есть фрагмент кода, настроенный для проверки условия, и на основе этого условия либо выполнить вызов ajax для получения объекта JSON, либо перейти к другой форме обработки. После обработки я выполняю некоторые действия на основе данных, обработанных в операторе if / else.

Однако я столкнулся с проблемой. Код выполняет if / else, а затем продолжается до завершения обработки .get, и, таким образом, мой последний бит кода не работает должным образом. Есть ли способ отложить обработку остальной части кода до завершения .get?

Структура моего кода выглядит следующим образом:

 if(filename != undefined){
  $.get(filename, function(json){
    $.each(json, function(data){
      // Do stuff with the json
    });
  }, "json");
} else {
  // Do some other processing
}

// Do some additional processing based on the results from the if/else statement
// This bit is getting processed before the .get has finished doing it's thing
// Therefore there isn't anything for it to act upon
  

Ответ №1:

Вместо этого создайте функцию обратного вызова для остальной части операции:

 if(filename != undefined){
  $.get(filename, function(json){
    $.each(json, function(data){
      // Do stuff with the json
      doTheRest();
    });
  }, "json");
} else {
  // Do some other processing
  doTheRest();
}

function doTheRest(){

   // Do some additional processing based on the results from the if/else statement

}
  

Просто запомните области видимости переменных и, если необходимо, передайте параметры в doTheRest функцию.

Ответ №2:

Используйте async: false опцию для $.get выполнения синхронных запросов. http://api.jquery.com/jQuery.ajax /

ПРИМЕЧАНИЕ:

@Neal: «это не всегда лучший вариант. особенно, если запрос ajax зависает слишком долго «.

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

1. @Kevin — это не всегда лучший вариант. особенно, если запрос ajax зависает слишком долго.

2. Спасибо, Нил, это правда. Я добавлю это в ответ