Я просто столкнулся с чем-то странным. У меня есть два массива JSON, которые содержат разные данные. Обычно мне нужны данные только из одного из них, но когда я пытаюсь выполнить двойной вызов ajax для получения данных из обоих массивов, я получаю точные данные по обоим вызовам.
Скажем, массив 1 содержит данные JSON для пользователей, а массив 2 хранит данные JSON в домах, и я хочу получать данные из обоих массивов: (PS! Я вырезал url
и type
чтобы сохранить пару строк.)
$.ajax({ async:false, data:"type=users&id=3,5,6", success: function(data) { data = JSON.parse(data); alert(data.length) //will alert 3 as expected } });
Затем я делаю второй звонок, чтобы получить там некоторые дома:
$.ajax({ async:false, data:"type=houses&id=2,4", success: function(data) { data = JSON.parse(data); alert(data.length) //alerts 3 as well... } });
Когда я смотрю на параметры и ответ с Firebug, я вижу, что параметры верны, но ответ неверен.
На моем PHP я даже пытался просто откликнуться на все, что приходит в этом:
echo $_GET['id'] . ", " . $_GET['type'];
Который сделал запрос похожим на оба вызова … Если я поставил предупреждение между вызовами ajax, я получаю ожидаемый результат (так как система ждет). Но я думал, что поставить их обоих синхронно было бы достаточно, чтобы не сбивать звонки ..?
edit: Я попытался создать копию файла php, который вызывается в функции AJAX, и настроить вызовы на разделение файлов, что заставляет все работать должным образом. Поэтому я уверен, что нет ничего плохого в javascript.
more edit: Если я удалю параметры со второго вызова AJAX, я все равно получаю тот же результат. Глядя на запрос с Firebug, я вижу, что список параметров пуст, но ответ по-прежнему идентичен …
еще более правка: Оглядываясь в Firebug, я вижу, что есть заголовок с именем connection
который имеет значение keep-alive
, а затем заголовок Keep-Alive
со значением 300
. Я предполагаю, что это может иметь какое-то отношение к этому? Не могу найти что-либо на нем в документах jQuery, хотя …
Исходный код: я сделал небольшой тестовый пример, который воспроизводит проблему:
PHP
echo $_GET['test']; die();
HTML
<sript> $(document).ready(function() { $.ajax({ type:"get", url:"bugtest.php", data="test=hello", success: function(data) { $("output").append(data); } }); $.ajax({ type:"get", url:"bugtest.php", data="test=world!", success: function(data) { $("output").append(" "+data); } }); }); </script> <h1>AJAX bug in Aptana's PHP server?</h1> <output></output>
Это все, что у меня есть, и он делает то же самое: вместо того, чтобы hello world!
как и следовало ожидать, я hello hello
…
Для того, чтобы определить, что PHP или JS – проблема, вы могли бы использовать Чарльз для контроля вашего запроса (я доверяю charles больше, чем firebug на самом деле, dunno why) и генерирует уникальное значение serveride
<?php echo uniqid();
Если оба запроса возвращают одно и то же значение, что-то не так с вашим сервером, иначе это браузер или jscode.
в первую очередь, синхронные вызовы AJAX в корне плохи в живой системе. Тестирование в порядке, но не делайте этого дома, дети! Зачем? Потому что, если сервер не отвечает в течение секунды или вообще (что вполне вероятно), вкладка браузера становится неактивной. В худшем случае (старый Mozillas) весь браузер замерзнет.
</teaching>
Кэширование не должно быть проблемой, поскольку URL-адреса разные, когда вы отправляете запросы GET (POST, скорее всего, не кэшируются вообще).
Тест alert()
говорит вам, что это не ошибка PHP, потому что он отправляет все материалы по запросу
Таким образом, мы остаемся с JavaScript:
Если бы вы вручную написали код, я бы предположил, что вы делаете неправильную проверку на onreadystate
(то есть, функция обрабатывает запрошенные проверки данных на неправильном объекте запроса)
Можете ли вы рассказать нам, какую библиотеку вы используете? Похоже, прототип мне.
Ура,
вы пытались добавить временную метку к URL-адресу? просто чтобы избежать кеширования и т. д.
data:"type=houses&id=2,4&"+timestamp
ОБНОВИТЬ:
или просто попробуйте cache:false
в Ajax
Вы используете async:false
Async:
По умолчанию все запросы отправляются асинхронно (т.е. по умолчанию это значение равно true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, пока запрос активен.
может быть из-за этого временного блокирования .. вы можете попробовать установить его в true.
Попробуйте использовать POST.
Также, если PHP получает 2 одинаковых запроса, когда они на самом деле не должны быть, то это не ошибка PHP; ошибка находится где-то между местом, где вы делаете вызов $ .ajax и где веб-сервер передает запрос на PHP.
Не могли бы вы предоставить дополнительную информацию о веб-сервере? Какой из них вы используете? У вас есть какая-то ловкость или оптимизация? Может быть, вы используете некоторую фреймворк PHP или PHP-бутстрап, который может кэшировать запрос?
Вы также можете попробовать сделать автономный тест. Разделите код Ajax и используйте минимальный скрипт php, который просто перекликается с запросом. Посмотрите, есть ли у вас такая же ошибка.
Некоторые данные о копировании вставляемых запросов и запросы, полученные в php, будут приятными.
Я никогда не видел ничего подобного, я почти уверен, что это связано с этим. В качестве обходного пути вы могли бы просто объединить оба запроса в одном, вам придется немного изменить скрипт PHP. На самом деле это, вероятно, лучшее решение, так как вы всегда должны пытаться сделать как можно меньше запросов на сервер.
Возможно ли, что есть некоторая проблема с переменной данных?
Что произойдет, если вы измените свой второй запрос:
$.ajax({ async:false, data:"type=houses&id=2,4", success: function(dataHouse) { data = JSON.parse(dataHouse); alert(dataHouse.length) } });
Поместите следующий вызов ajax в ответ первого вызова ajax:
function nextAjaxCall(){ $.ajax({ async:false, data:"type=houses&id=2,4", success: function(data) { data = JSON.parse(data); alert(data.length) //alerts 3 as well... } }); } $.ajax({ async:false, data:"type=users&id=3,5,6", success: function(data) { data = JSON.parse(data); alert(data.length) //will alert 3 as expected nextAjaxCall(); } error: function(){ //error handling nextAjaxCall(); } });
Убедитесь, что вы вызываете второй аякс, даже если первый из них не возвращается успешно.
Попробуйте установить global: false в параметрах jQuery ajax ().
Если это не поможет, попробуйте называть две разные страницы PHP – одну для дома и одну для пользователей. Если это сработает, это должно по крайней мере помочь уменьшить проблему.
Попробуйте поместить второй запрос в таймаут, который ждет 0 секунд.
$.ajax({ async:false, data:"type=users&id=3,5,6", success: function(data) { data = JSON.parse(data); alert(data.length) //will alert 3 as expected } }); setTimeout(function(){$.ajax({ async:false, data:"type=houses&id=2,4", success: function(data) { data = JSON.parse(data); alert(data.length) //alerts 3 as well... } })}, 0);