programing

JQuery - 글로벌 변수에 Ajax 응답 저장

abcjava 2023. 4. 6. 20:42
반응형

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

반응형