2013-07-14 8 views
6

मेरे पास एक ऐसा फ़ंक्शन है जो कॉलबैक फ़ंक्शन स्वीकार करता है जहां मैं डेटा को वापस पास करता हूं। क्या यह बेहतर अभ्यास के लिए स्थगित ऑब्जेक्ट में परिवर्तित हो सकता है?कॉलबैक नमूना को स्थगित ऑब्जेक्ट में कैसे परिवर्तित करें?

यहाँ मैं क्या मिला है:

var chapters; 
    var getChapters = function (fnLoad) { 
     //CACHE DATA IF APPLICABLE 
     if (!chapters) { 
      //CALL JSON DATA VIA AJAX 
      $.getJSON('/chapters.txt') 
       .done(function (json) { 
        //STORE DATA IN LOCAL STORAGE 
        chapters = Lawnchair(function() { 
         this.save(json, function (data) { 
          //CALL CALLBACK ON DATA 
          fnLoad(data); 
         }); 
        }); 
       }); 
     } else { 
      //RETURN ALREADY CREATED LOCAL STORAGE 
      chapters.all(function (data) { 
       //CALL CALLBACK ON DATA 
       fnLoad(data); 
      }); 
     } 
    }; 

तो मैं बस इसे इस तरह का उपयोग करें:

this.getChapters(function (data) { 
    console.log(data); 
}); 

मैं इसे कैसे एक वादा की तरह उपयोग कर सकते हैं, जबकि कैश दृष्टिकोण को बनाए रखने हालांकि?

this.getChapters().done(function (data) { 
    console.log(data); 
}); 
+0

jQuery की AJAX विधियां स्थगित वस्तु का विस्तार करती हैं। आप पहले से ही इसका उपयोग कर रहे हैं ... –

+0

लेकिन ध्यान दें कि मैं डेटा को वापस करने से पहले डेटा में हेरफेर कर रहा हूं और बीच में कहीं "लॉन्चैयर" का उपयोग कर रहा हूं, इसलिए मैं AJAX ऑब्जेक्ट को सही नहीं कर सकता? – TruMan1

+0

सभी कैप्स में आपकी टिप्पणियां क्यों हैं? – Eric

उत्तर

3
var chapters; 
var getChapters = function (fnLoad) { 
    var d = new $.Deferred(); 
    //CACHE DATA IF APPLICABLE 
    if (!chapters) { 
     //CALL JSON DATA VIA AJAX 
     $.getJSON('/chapters.txt') 
      .done(function (json) { 
       //STORE DATA IN LOCAL STORAGE 
       chapters = Lawnchair(function() { 
        this.save(json, function (data) { 
         //CALL CALLBACK ON DATA 
         d.resolve(data); 
        }); 
       }); 
      }) 
      .fail(function() { d.reject(); }); 
    } else { 
     //RETURN ALREADY CREATED LOCAL STORAGE 
     chapters.all(function (data) { 
      //CALL CALLBACK ON DATA 
      d.resolve(data); 
     }); 
    } 
    return d.promise(); 
}; 

Relevant example

2

मैं देख रहा हूँ आप पहले से ही एक जवाब स्वीकार कर लिया है, लेकिन यदि आप एक बड़े मानसिक छलांग लेने के लिए और खुद को chapters के बजाय chapters के वादे की दुकान है, तो कोड काफी सरल बनाएगा ।

इन दिनों, यह शायद "fetch/कैश" स्थिति के लिए अधिक आम तौर पर अपनाया जाने वाला दृष्टिकोण है।

var chapters_promise; 
var getChapters = function() { 
    //Cache data if applicable and return promise of data 
    if (!chapters_promise) 
     chapters_promise = $.getJSON('/chapters.txt').then(Lawnchair).then(this.save); 
    return chapters_promise; 
}; 

क्या वास्तव में देने का वादा किया है (अध्याय) मूल्य (s), कार्यों Lawnchair और this.save द्वारा लौटाए गए तो आप अभी भी कुछ काम है द्वारा निर्धारित किया जाएगा।

getChapters() हमेशा एक वादा वापस कर देगा, इस पर ध्यान दिए बिना कि डेटा को लाने की आवश्यकता है या पहले से ही कैश किया गया है। इसलिए, getChapters() केवल, वादा तरीकों .then(), .done(), .fail() या .always() साथ इस्तेमाल किया जा सकता उदाहरण के लिए:

getChapters().then(fnLoad); 

आप chapters तक पहुँचने के लिए कोई दूसरा रास्ता नहीं है, लेकिन, आप डॉन getChapters() के किसी भी कॉल पर के बाद से उचित है यह नहीं पता कि यह $.getJSON() शाखा या साधारण return शाखा का पालन करेगा, जिसमें से दोनों एक समान वादे वापस कर देंगे।

संबंधित मुद्दे