JQuery - 글로벌 변수에 Ajax 응답 저장
저는 아직 jQuery와 ajax 장면에 익숙하지 않습니다만, 몇개의 XML 파일(최대 6KB 이하)을 취득하기 위해서 GET를 실행하는 $.ajax 요구가 있습니다만, 유저가 그 페이지에 소비하는 기간 동안, XML 컨텐츠는 변경되지 않습니다(이 디자인은 변경할 수 없습니다).다른 곳에서 읽고 있기 때문에 XML 파일을 변경할 수 없습니다).따라서 응답 데이터를 저장할 글로벌 변수가 있으며, 이후 데이터에 대한 조회가 이 변수에 대해 수행되므로 여러 요청을 수행할 필요가 없습니다.
XML 파일이 증가할 수 있다는 사실을 감안할 때, 이것이 베스트 프랙티스인지 확실하지 않고, 또한 자바 배경에서 나온 글로벌 퍼블릭 변수에 대한 나의 생각은 일반적으로 부정적이다.
그럼 더 좋은 방법이 없을까 하는 질문입니다.또, 파일이 너무 큰 사이즈로 확장되어도, 메모리 문제는 발생하지 않는가 하는 질문도 있습니다.
데이터는 xml 오브젝트 내의 getter/setter 타입의 함수에 전달되어 글로벌한 퍼블릭 변수 문제를 해결할 수 있다고 생각합니다만, 응답을 오브젝트 자체에 보존할 필요가 있는지는 의문입니다.
예를 들어, 현재 하고 있는 일은 다음과 같습니다.
// 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');
여기 그 일을 꽤 잘 하는 기능이 있습니다.위의 Best Answer를 사용할 수 없습니다.
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");
보관하는 것 외에는 다른 방법이 없다.메모리의 페이징에 의해서, 잠재적인 문제가 경감됩니다.
'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');
이 방법은 효과가 있었습니다.
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
부탁한다.
이럴 필요 없어나도 내 프로젝트에서 같은 문제에 부딪혔다.성공 시 콜백 내에서 함수 호출을 실행하여 글로벌 변수를 리셋합니다.비동기 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;
}
이것이 당신에게 도움이 되길 바랍니다.
응답 값은 글로벌하게 액세스 할 수 있기 때문에, DOM 엘리먼트에 보존하기 쉬워질 가능성이 있습니다.
<input type="hidden" id="your-hidden-control" value="replace-me" />
<script>
$.getJSON( '/uri/', function( data ) {
$('#your-hidden-control').val( data );
} );
</script>
이를 통해 비동기를 false로 설정할 필요가 없다는 장점이 있습니다.이것이 적절한지 아닌지는, 무엇을 달성하려고 하는가에 달려 있습니다.
이 문제는 "성공" 함수의 실행과 변수에서 데이터를 삭제하려는 시간 사이의 서버 지연뿐 로컬 또는 글로벌 범위와는 관련이 없을 수 있습니다.
ajax "success" 함수가 발생하기 전에 변수 내용을 인쇄하려고 할 수 있습니다.
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');
이거 돼!!!
이벤트의 "document.ready" 단계에서 jQuery ajax 결과를 변수에 포함시키는 데 정말 고생했습니다.
jQuery의 Ajax는 페이지가 이미 로드된 후 사용자가 선택 상자의 "변경" 이벤트를 트리거할 때 내 변수에 로드되지만, 처음 페이지가 로드되었을 때 데이터가 변수를 공급하지 않습니다.
여러 가지 방법을 시도했지만 결국 찰스 길버트의 방법이 가장 효과적이었습니다.
찰스 길버트에게 경의를 표합니다!그의 답변을 사용하면 페이지가 처음 로드될 때에도 데이터를 변수에 가져올 수 있습니다.
작업 스크립트의 예를 다음에 나타냅니다.
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");
function get(a){
bodyContent = $.ajax({
url: "/rpc.php",
global: false,
type: "POST",
data: a,
dataType: "html",
async:false
}
).responseText;
return bodyContent;
}
이것도 마주쳤죠많은 답변이 있지만, 제가 제공할 간단한 정답은 하나뿐입니다.열쇠는 $.ajax에 전화를 거는 것입니다.동기!
$.ajax({
async: false, ...
그 실이 오래됐다는 건 알지만, 다른 누군가가 이것을 유용하게 여길 것 같아서요.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;
결과를 문자열에 직접 전달하는 데 도움이 됩니다..response에 주의해 주세요.텍스트, 부품
IMO 이 데이터를 전역 변수에 저장할 수 있습니다.그러나 다음과 같은 고유한 이름을 사용하거나 네임스페이스를 사용하는 것이 좋습니다.
My Company = {};
MyCompany.cachedData = "MyCompany";
또한 이러한 용도로 json을 사용하는 것이 좋습니다. 일반적으로 json 형식의 데이터는 xml 형식의 동일한 데이터보다 훨씬 작습니다.
서버에서 큰 XML 파일을 가져오는 것은 피하는 것이 좋습니다.변수 "xml"은 데이터 저장소 자체로서가 아니라 캐시와 같이 사용해야 합니다.
대부분의 시나리오에서는 캐시를 검사하여 원하는 데이터를 얻기 위해 서버에 요청을 해야 하는지 여부를 확인할 수 있습니다.이렇게 하면 앱이 가볍고 빨라집니다.
건배, Jrh.
.get 응답은 기본적으로 캐시됩니다.따라서 원하는 결과를 얻기 위해 아무것도 할 필요가 없습니다.
이전 답변과 유사:
<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>
그냥 이걸 사용해 단순하고 효과적:
var y;
function something(x){
return x;
}
$.get(bunch of codes, function (data){
y=something(data);
)}
//anywhere else
console.log(y);
언급URL : https://stackoverflow.com/questions/905298/jquery-storing-ajax-response-into-global-variable
'programing' 카테고리의 다른 글
반응과 함께 구글 사인 버튼 사용 (0) | 2023.04.06 |
---|---|
Ajax를 사용하여 Select2를 사용하여 로드 시 초기 값 설정 (0) | 2023.04.06 |
기존 Spring Boot App에서 OpenApi 3.0 사양을 생성하는 방법 (0) | 2023.04.06 |
jQuery.browser: Javascript Unaught TypeError (0) | 2023.04.01 |
javascript를 사용하여 div를 angular로 인쇄합니다.JS 단일 페이지 응용 프로그램 (0) | 2023.04.01 |