مسج - تخزين استجابة أجاكس في المتغير العالمي

StackOverflow https://stackoverflow.com/questions/905298

  •  05-09-2019
  •  | 
  •  

سؤال

ما زلت إلى حد ما من مبتدئ على جيس ومشهد Ajax، لكن لدي طلب .ajax $ يؤدي إلى استرداد بعض ملفات XML (~ 6 كيلو بايت أو أقل)، ولكن للمدة التي ينفقها المستخدم على تلك الصفحة التي يجب أن تكون محتوى xml لا يتغير / لن يتغير (هذا التصميم الذي لا يمكنني تغييره، وأنا لا يمكنني الوصول إلى تغيير ملف XML كما أقرأه من مكان آخر). لذلك لدي متغير عالمي قمت بتخزين بيانات الاستجابة فيها، وأي نظرة لاحقة على البيانات تتم في هذا المتغير حتى لا تحتاج طلبات متعددة.

بالنظر إلى حقيقة أن ملف XML يمكن أن يزيد، لست متأكدا من أن هذه هي أفضل الممارسات، كما تأتي من خلفية جافا أفكاري حول المتغيرات العامة العالمية عموما لا لا.

لذا فإن السؤال الذي لدي هو ما إذا كان هناك طريقة أفضل للقيام بذلك، وسؤال حول ما إذا كان هذا يؤدي أي مشاكل في الذاكرة إذا كان الملف يتوسع إلى بعض حجم ملف مثير للسخرية؟

أروض أن البيانات يمكن أن يتم تمرير البيانات إلى بعض وظائف نوع Getter / Studter داخل كائن XML، والتي من شأنها أن تحل مشكلاتي المتغيرة العامة العالمية، ولكن لا تزال ترفع السؤال حول ما إذا كان يجب علي تخزين الاستجابة داخل الكائن نفسه.

على سبيل المثال، ما أقوم به حاليا هو:

// 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');
هل كانت مفيدة؟

المحلول

لا توجد طريقة حولها إلا لتخزينها. يجب أن تقلل الترحيل الذاكرة القضايا المحتملة هناك.

أود أن أقترح بدلا من استخدام متغير عالمي يسمى "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');

نصائح أخرى

إليك وظيفة تقوم بهذه المهمة جيدا. لم أستطع الحصول على أفضل إجابة أعلاه للعمل.

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");

هذا عملت بالنسبة لي:

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 غير متزامن مجموعة كاذبة، ستعمل بشكل صحيح. هنا هو رمز بلدي. آمل أن يساعد.

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>

هذا لديه ميزة عدم الحاجة إلى تعيين ASYNC إلى FALSE. من الواضح أنه ما إذا كان هذا مناسبا يعتمد على ما تحاول تحقيقه.

قد لا تكون مشكلتك مرتبطة بأي مجال محلي أو عالمي لهذه المسألة فقط تأخير الخادم بين وظيفة "النجاح" المنفذة والوقت الذي تحاول إخراج البيانات من المتغير الخاص بك.

تحاول فرص طباعة محتويات المتغير قبل حرائق وظيفة AJAX "النجاح".

        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');

هذا يعمل!!!

     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }

ركض في هذا أيضا. الكثير من الإجابات، ومع ذلك، فقط واحدة صحيحة واحدة فقط أنا ذاهب إلى توفير. المفتاح هو جعل دعوة $ .jax لديك..sync!

$.ajax({  
    async: false, ...

لقد ناضلت حقا مع الحصول على نتائج jQuery ajax في متغيراتي في مرحلة "المستند" Ready "من الأحداث.

سيتم تحميل أجاكس jQuery في المتغيرات الخاصة بي عندما يؤدي المستخدم إلى حدث "Onchange" في مربع "تحديد" بعد تحميل الصفحة بالفعل، لكن البيانات لن تغذي المتغيرات عند تحميل الصفحة لأول مرة.

حاولت الكثير من الطرق والعديد من الطرق المختلفة، ولكن في النهاية، كانت طريقة تشارلز غويلبيرت التي عملت بشكل أفضل بالنسبة لي.

القبعات قبالة تشارلز جويلر! باستخدام إجابته، يمكنني الحصول على بيانات في المتغيرات الخاصة بي، حتى عند تحميل صفحتي أولا.

إليك مثال على البرنامج النصي الوظيفي:

    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");

IMO يمكنك تخزين هذه البيانات في المتغير العالمي. ولكن سيكون من الأفضل استخدام بعض الاسم الفريد أو استخدام مساحة الاسم:

mycompany = {}؛

...
mycompany.cacheddata = البيانات؛

وأيضا من الأفضل استخدام JSON لهذه الأغراض، عادة ما تكون البيانات في تنسيق JSON أصغر بكثير من نفس البيانات بتنسيق XML.

أقترح أن يتم تجنب جلب ملفات XML الكبيرة من الخادم: يجب استخدام المتغير "XML" مثل مخبأ, ، وليس كما تخزن البيانات نفسها.

في معظم السيناريوهات، من الممكن فحص ذاكرة التخزين المؤقت ومعرفة ما إذا كنت بحاجة إلى تقديم طلب إلى الخادم للحصول على البيانات التي تريدها. هذا سيجعل تطبيقك أخف وزنا وأسرع.

هتاف، JRH.

يتم التخزين المؤقت عن الاستجابات مؤقتا بشكل افتراضي. لذلك أنت حقا بحاجة إلى عدم القيام بأي شيء للحصول على النتائج المرجوة.

أعرف أن الخيط قديم لكنني اعتقدت أن شخصا آخر قد يجد هذا مفيدا. وفقا ل 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;

سوف تساعد في الحصول على النتيجة إلى سلسلة مباشرة. لاحظ ال .RESPONESTEXT؛ جزء.

مماثلة للإجابة السابقة:

<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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top