#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(',');
это происходит относительно намного позже — после успешного выполнения запроса. Если вы хотите, чтобы второй пример работал, вам нужно дождаться назначения координат. Что-то вроде этой рабочей скрипки:
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. Я отредактировал свой пост, добавив рабочий код и скрипку, с которой вы можете поиграть сами. Получайте удовольствие.