JQuery - сохранение ответа ajax в глобальной переменной
Я все еще немного новичок в jQuery и сценарии ajax, но у меня есть запрос $.ajax, выполняющий GET для извлечения некоторых файлов XML (~ 6 КБ или менее), однако на время, которое пользователь тратит на эту страницу, XML-контент не должен/не измениться (этот проект я не могу изменить, у меня также нет доступа к изменению файла XML, поскольку я его читаю откуда-то еще). Поэтому у меня есть глобальная переменная, в которой хранятся данные ответа, и любые последующие запросы на данные выполняются для этой переменной, поэтому не нужно делать несколько запросов.
Учитывая тот факт, что XML файл может увеличиться, я не уверен, что это лучшая практика, а также исходящий из java-фона мои мысли о глобальных общедоступных переменных, как правило, не имеют значения.
Таким образом, у меня есть вопрос: может ли быть лучший способ сделать это, и вопрос о том, вызывает ли это какие-либо проблемы с памятью, если файл расширяется до какого-то смешного размера файла?
Я полагаю, что данные могут быть переданы в некоторые функции типа getter/setter внутри объекта xml, что позволило бы решить мои глобальные проблемы с переменными public, но все еще вызывает вопрос о том, следует ли хранить ответ внутри самого объекта.
Например, что я сейчас делаю:
// top of code
var xml;
// get the file
$.ajax({
type: "GET",
url: "test.xml",
dataType: "xml",
success : function(data) {
xml = data;
}
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');
Ответы
Ответ 1
Там нет пути, кроме как хранить его. Пейджинг памяти должен уменьшить потенциальные проблемы.
Я бы предложил вместо использования глобальной переменной, называемой "xml", сделать что-то более похожее на это:
var dataStore = (function(){
var xml;
$.ajax({
type: "GET",
url: "test.xml",
dataType: "xml",
success : function(data) {
xml = data;
}
});
return {getXml : function()
{
if (xml) return xml;
// else show some error that it isn't loaded yet;
}};
})();
затем выполните следующие действия:
$(dataStore.getXml()).find('something').attr('somethingElse');
Ответ 2
Вот функция, которая хорошо выполняет работу. Я не мог получить лучший ответ выше, чтобы работать.
jQuery.extend({
getValues: function(url) {
var result = null;
$.ajax({
url: url,
type: 'get',
dataType: 'xml',
async: false,
success: function(data) {
result = data;
}
});
return result;
}
});
Затем для доступа к нему создайте переменную следующим образом:
var results = $.getValues("url string");
Ответ 3
Это сработало для меня:
var jqxhr = $.ajax({
type: 'POST',
url: "processMe.php",
data: queryParams,
dataType: 'html',
context: document.body,
global: false,
async:false,
success: function(data) {
return data;
}
}).responseText;
alert(jqxhr);
// or...
return jqxhr;
Важно отметить: global: false
, async:false
и, наконец, responseText
прикованный к запросу $.ajax
.
Ответ 4
Вам не нужно ничего делать. Я столкнулся с той же проблемой с моим проектом. то, что вы делаете, это вызвать вызов функции внутри обратного вызова при успешном завершении до reset глобальной переменной. До тех пор, пока вы установите асинхронный javascript в false, он будет работать правильно. Вот мой код. Надеюсь, что это поможет.
var exists;
//function to call inside ajax callback
function set_exists(x){
exists = x;
}
$.ajax({
url: "check_entity_name.php",
type: "POST",
async: false, // set to false so order of operations is correct
data: {entity_name : entity},
success: function(data){
if(data == true){
set_exists(true);
}
else{
set_exists(false);
}
}
});
if(exists == true){
return true;
}
else{
return false;
}
Надеюсь, это поможет вам.
Ответ 5
Возможно, вам легче хранить значения ответов в элементе DOM, поскольку они доступны глобально:
<input type="hidden" id="your-hidden-control" value="replace-me" />
<script>
$.getJSON( '/uri/', function( data ) {
$('#your-hidden-control').val( data );
} );
</script>
Это имеет то преимущество, что не нужно устанавливать async в false. Ясно, зависит ли это от того, чего вы пытаетесь достичь.
Ответ 6
ваша проблема может быть не связана с какой-либо локальной или глобальной областью, на самом деле просто задержка сервера между исполняемой функцией "успех" и временем, когда вы пытаетесь извлечь данные из вашей переменной.
Скорее всего, вы пытаетесь распечатать содержимое переменной до того, как будет запущена функция ajax "success".
Ответ 7
function getJson(url) {
return JSON.parse($.ajax({
type: 'GET',
url: url,
dataType: 'json',
global: false,
async: false,
success: function (data) {
return data;
}
}).responseText);
}
var myJsonObj = getJson('/api/current');
Это работает!!!
Ответ 8
function get(a){
bodyContent = $.ajax({
url: "/rpc.php",
global: false,
type: "POST",
data: a,
dataType: "html",
async:false
}
).responseText;
return bodyContent;
}
Ответ 9
В этом тоже. Много ответов, тем не менее, только одна простая правильная, которую я собираюсь предоставить. Ключ должен сделать ваш вызов $.ajax..sync!
$.ajax({
async: false, ...
Ответ 10
Я действительно боролся с получением результатов jQuery ajax в мои переменные на этапе "document.ready".
jQuery ajax будет загружаться в мои переменные, когда пользователь запускает событие "onchange" в окне выбора после того, как страница уже загружена, но данные не будут передавать переменные при первой загрузке страницы.
Я пробовал много, много и много разных методов, но в конце концов, это был метод Чарльза Гильберта, который лучше всего работал у меня.
Шляпы к Чарльзу Гильберту! Используя его ответ, я могу получить данные в свои переменные, даже когда моя страница загружается первой.
Здесь приведен пример рабочего script:
jQuery.extend
(
{
getValues: function(url)
{
var result = null;
$.ajax(
{
url: url,
type: 'get',
dataType: 'html',
async: false,
cache: false,
success: function(data)
{
result = data;
}
}
);
return result;
}
}
);
// Option List 1, when "Cats" is selected elsewhere
optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");
// Option List 1, when "Dogs" is selected elsewhere
optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");
// Option List 2, when "Cats" is selected elsewhere
optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");
// Option List 2, when "Dogs" is selected elsewhere
optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");
Ответ 11
IMO вы можете хранить эти данные в глобальной переменной. Но лучше использовать еще одно уникальное имя или использовать пространство имен:
MyCompany = {};
...
MyCompany.cachedData = data;
И также лучше использовать json для этих целей, данные в формате json обычно намного меньше, чем те же данные в формате xml.
Ответ 12
Я бы предположил, что следует избегать получения больших XML файлов с сервера: переменная "xml" должна использоваться как кеш, а не как хранилище данных.
В большинстве сценариев можно просмотреть кеш и посмотреть, нужно ли вам делать запрос на сервер для получения требуемых данных. Это сделает ваше приложение легче и быстрее.
cheers, jrh.
Ответ 13
.get ответы кэшируются по умолчанию. Поэтому вам действительно нужно ничего не делать, чтобы получить желаемые результаты.
Ответ 14
Я знаю, что нить устарела, но я подумал, что кто-то другой может найти это полезным. Согласно jquey.com
var bodyContent = $.ajax({
url: "script.php",
global: false,
type: "POST",
data: "name=value",
dataType: "html",
async:false,
success: function(msg){
alert(msg);
}
}).responseText;
поможет получить результат непосредственно в строке.
Обратите внимание на часть .responseText;.
Ответ 15
Аналогично предыдущему ответу:
<script type="text/javascript">
var wait = false;
$(function(){
console.log('Loaded...');
loadPost(5);
});
$(window).scroll(function(){
if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
// Get last item
var last = $('.post_id:last-of-type').val();
loadPost(1,last);
}
});
function loadPost(qty,offset){
if(wait !== true){
wait = true;
var data = {
items:qty,
oset:offset
}
$.ajax({
url:"api.php",
type:"POST",
dataType:"json",
data:data,
success:function(data){
//var d = JSON.parse(data);
console.log(data);
$.each(data.content, function(index, value){
$('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
$('#content').append('<h2>'+value.id+'</h2>');
$('#content').append(value.content+'<hr>');
$('#content').append('<h3>'+value.date+'</h3>');
});
wait = false;
}
});
}
}
</script>