Javascript: проблема с закрытием, я думаю .. или что-то странное?

#javascript #jquery #serverside-javascript

#javascript #jquery #серверная часть-javascript

Вопрос:

Ну, я использовал jQuery для запроса Ajax Post и получения данных обратно.

Ajax работает нормально, но:

 coordinates = [];

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); alert(coordinates); });  // Alerts the Coordinates as Expected :)
  

Но..

 $.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); });

alert(coordinates); // Alerts with a Blank Box :(
  

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

Ответ №1:

В этом:

 $.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); });
alert(coordinates); 
  

Вы немедленно выполняете оповещение еще до того, как сообщение возвращается с сервера.

Итак, я бы сказал, что проблема больше связана с порядком выполнения, чем с закрытием.

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

1. Можем ли мы немного поработать с использованием jquery .. ?? Например, у нас есть $ (document). готово(функция () {/* Материал здесь * /}); Итак, можем ли мы сделать это аналогичным образом… Можем ли мы иметь готовую функцию для этого вызова ajax???

Ответ №2:

Ваш alert(coordinates); выполняется перед function(result) {...} вызовом. Добро пожаловать в асинхронный мир.

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

1. Хорошо .. Я пробую другой подход, но эта строка «асинхронный мир» была великолепна!

Ответ №3:

Это имеет смысл. В вашем втором примере alert(coordinates); происходит сразу. Тогда как coordinates = result.split(','); это происходит относительно намного позже — после успешного выполнения запроса. Если вы хотите, чтобы второй пример работал, вам нужно дождаться назначения координат. Что-то вроде этой рабочей скрипки:

http://jsfiddle.net/UtXgK/11/

 var coordinates = 'no response from server yet';
$.post("/echo/json/",{json:'{"data":"one,two,three"}'},function(result) { coordinates=result.data.split(','); alert(coordinates[1]);});
setTimeout(function(){ alert(coordinates[2]); }, 5000);
  

Предполагая, что для возврата результата из вашего $.post требуется не более 5 секунд.

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

1. Можем ли мы немного поработать с использованием jquery .. ?? Например, у нас есть $ (document). готово(функция () {/* Материал здесь * /}); Итак, можем ли мы сделать это аналогичным образом… Можем ли мы иметь готовую функцию для этого вызова ajax???

2. Ваш подход показывает ошибку: setTimeout(‘alert(coordinates);’, 5000); Ошибка: координаты не определены!! Я думаю, теперь это проблема с закрытием??

3. Нет, это не проблема с закрытием, вы, вероятно, не объявляли координаты (мой код — это всего лишь фрагмент). И да, в jQuery 1.5 введено объединение в цепочку дополнительных обработчиков событий. Смотрите документацию по обещаниям и отложенным объектам: api.jquery.com/category/deferred-object

4. Ну, я объявил координаты (подтвердил), но он показывает ошибку. И можете ли вы дать фрагмент решения jquery, поскольку я исследую проблему, но я только начинающий! Пожалуйста, не возражайте.. Я новичок!

5. Я отредактировал свой пост, добавив рабочий код и скрипку, с которой вы можете поиграть сами. Получайте удовольствие.