Поиск данных в Drupal Ajax задерживается - PullRequest
0 голосов
/ 19 января 2010

У меня есть простая функция щелчка с приведенным ниже кодом, но я не могу получить данные по первому щелчку.

 $.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { testit = result; },
  dataType: 'json',
  data: 'js=1'
 });
 alert(testit);

В моей функции обратного вызова у меня просто есть return drupal_json ('привет'); но это не проявляется до второго раза. Например, если я нажму на кнопку, ничего не произойдет, но если я нажму на нее снова, она выдаст «привет». В случае, если есть динамические данные, то они также будут задержаны одним кликом. Например, если щелкнуть первый раз, должно появиться предупреждение 1, во второй раз - 2 и так далее. Вместо этого первый щелчок ничего не даст, второй щелчок предупредит 1, третий щелчок предупредит 2 и т. Д. Есть идеи, почему это происходит? Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 января 2010

Вероятно, это происходит потому, что запрос AJAX не блокирует скрипт. Он идет вперед и делает запрос, но не ждет, пока результаты вернутся, прежде чем он выполнит следующую строку (ваше предупреждение). Таким образом, при первом обращении к предупреждению данные не были выбраны, во второй раз он получает данные только из первого запроса (второй запрос начался, но не завершен) и т. Д.

Решение состоит в том, чтобы поместить оповещение в функцию обратного вызова, которая не выполняется до тех пор, пока не будет получен ответ:

$.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { alert(result); },
  dataType: 'json',
  data: 'js=1'
 });
0 голосов
/ 19 января 2010

a в ajax означает асинхронный.следовательно, testit не будет установлен на результат ответа ajax, пока не будет вызвана функция success: (когда вызов ajax успешно завершен)

$.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { testit = result; alert(testit); },
  dataType: 'json',
  data: 'js=1'
});

, если вы хотите, чтобы он работалсинхронно, вы также можете установить aysnc:false в параметрах jQuery .ajax, например:

var testit = $.ajax({
  type: 'POST',
  async: false,
  url: 'test/get/1',
  dataType: 'json',
  data: 'js=1'
}).responseText;

alert(testit);

во втором методе, ALL javascript будет задерживаться до завершения вызова ajax (обычно заметно медленного).Я бы порекомендовал просто сделать ваш код в обратном вызове success: из первого примера.тем не менее, вы можете также захотеть создать обратный вызов error: на случай, если что-то не получится (в противном случае ваш обратный вызов НИКОГДА не может быть вызван, потому что не было никакого успеха).

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