2012-10-05 13 views
20

मेरे पास रीढ़ की हड्डी का एप्लिकेशन है जिसमें कई विचार हैं। दृश्यों के बीच स्विचिंग विभिन्न संग्रह प्राप्त करने के लिए अजाक्स अनुरोधों को ट्रिगर करता है। अगर कोई नया शुरू होता है तो मैं वर्तमान "पढ़ा" AJAX अनुरोध को रोकना चाहता हूं। क्या यह संभव है?क्या बैकबोन "पढ़ने" अनुरोधों को रोकना संभव है

उत्तर

36

ठीक है तो यहाँ मैं

मैं एक चर

app.fetchXhr = this.model.fetch(); 

में अनुरोधों को लाने मेरी रूटर में बचत कर रहा हूँ क्या किया है, मैं एक समारोह है कि विचारों को बंद करने और विचारों प्रतिपादन का ख्याल रखता है है । यह प्रत्येक दृश्य परिवर्तन के लिए आवश्यक किसी ट्रिगर को ट्रिगर करने का भी ख्याल रखता है लेकिन यह इस प्रश्न में प्रासंगिक नहीं है।

कुछ भी करने से पहले, इस रूटर फ़ंक्शन निष्पादित निम्नलिखित

//Stop pending fetch 
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){ 
    app.fetchXhr.abort(); 
} 

मुझे आशा है कि इस मदद करता है

+0

मेरे पास एक संबंधित समस्या है लेकिन मेरे पास एक से अधिक संग्रह हैं। तो इससे पहले कि मैं एक अनुरोध रद्द कर दूं, मुझे यह सुनिश्चित करने की ज़रूरत है कि यह एक विशिष्ट संग्रह से जुड़ा हुआ है। मैंने यहां सवाल पूछा है, हो सकता है कि आप पहले ही इस मुद्दे से निपट चुके हैं? http://stackoverflow.com/questions/21919690/association-between-backbone-collection-and-xhr-object-created-when-fetching – wuliwong

+0

अभी तक इसे लागू नहीं किया गया है, लेकिन एक चीज जिसे आप कोशिश कर सकते हैं सभी xhr को स्टोर करना है एक सरणी में अनुरोध। प्रत्येक एक्सएचआर अनुरोध पर या प्रत्येक दृश्य परिवर्तन पर आप उन पूर्णियों को साफ़ करने के लिए सरणी के माध्यम से लूप कर सकते हैं और जिन्हें आप रोकना चाहते हैं उन्हें रोकने के लिए। यह एक पर्याप्त सफाई प्रदान करना चाहिए। – Xerri

4

मुझे लगता है कि आप jQuery के साथ रीढ़ की हड्डी का उपयोग कर रहे हैं। यदि हां, तो निम्नलिखित प्रश्न आप के लिए एक जवाब देने लगता है:

Abort Ajax requests using jQuery

बैकबोन fetchxhr वे के बारे में, IIRC बात कर रहे हैं देता है।

+0

लेकिन पूरा होने के बाद xhr वापसी नहीं करेगा? सुनिश्चित नहीं है कि बैकबोन – Xerri

+0

में इसे लागू करने के लिए आपके द्वारा प्रदान किए गए लिंक का उपयोग कैसे करें बैकबोन सामान्य AJAX कॉल (ज़िप्टो या jQuery के माध्यम से) का उपयोग करता है, जिसका अर्थ है कि सर्वर को कॉल असीमित है और अभी भी संभावित रूप से समाप्त हो सकता है। – JayC

-3

शायद एक देर जबाब :) टाइमआउट

उपयोग एक टाइमआउट मान निर्दिष्ट करने के लिए। यह त्रुटि फ़ंक्शन को ट्रिगर करेगा। यहां क्वेरी को निरस्त किया जा सकता है।

क्या कोई कारण है कि आप क्वेरी को निरस्त करना चाहते हैं?

+0

मैं निरस्त करना चाहता हूं क्योंकि अगर क्वेरी पूर्ण होने से पहले मैं दृश्य बदलता हूं, तो fetch पूरा होने पर एक त्रुटि उत्पन्न की जाएगी और दृश्य हटा दिया जाएगा। – Xerri

9

कोई और देर से उत्तर देने के मामले में कोई और इस में चलता है।

मैंने एक्सएचआर ऑब्जेक्ट पूल जोड़ने और लाने पर लंबित अनुरोधों को रद्द करने का विकल्प बैकबोन.sync को ओवरराइट करना समाप्त कर दिया।

var sync = Backbone.sync 
    , xhrPool = []; 

Backbone.sync = function(method, model, options) { 
    options = options || {}; 
    if (method === 'read') { 
    if (options.abortPending == true) {  
     for (var i = 0; i < xhrPool.length; i++) { 
     if (xhrPool[i]['readyState'] > 0 && xhrPool[i]['readyState'] < 4) { 
      xhrPool[i].abort(); 
      xhrPool.splice(i, 1); 
     } 
     } 
    } 

    // cleanup xhrPool 
    // todo: make removal from the pool an 'always' jqXHR callback 
    // instead of cleanup on every read? 
    for (var i = 0; i < xhrPool.length; i++) { 
     if (xhrPool[i]['readyState'] === 4) { 
     xhrPool.splice(i, 1); 
     } 
    } 

    var xhr = sync(method, model, options); 
    xhrPool.push(xhr); 
    return xhr; 
    } else { 
    return sync(method, model, options); 
    } 
}; 
+0

बहुत अच्छा .... यदि आप किसी विशेष दृश्य में एकाधिक फ़ेच अनुरोध करते हैं तो लचीला नहीं हो सकता है। एफवाईआई ... मुझे जिन कारणों की आवश्यकता थी, उनमें से एक था जब एक fetch पूरा हो जाता है तो त्रुटियों को फेंकने से बचने के लिए, लेकिन दृश्य बदल गया है (इसलिए डीओएम तत्व जिसमें डेटा शामिल होगा, अब वहां नहीं है)। लाने के चारों ओर एक सरल कोशिश/पकड़ इसे ठीक किया। – Xerri

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