2013-07-23 3 views
22

फ़ैई, मैं बस jQuery वादे सीखना शुरू कर रहा हूं, इसलिए मैं यहां थोड़ा उलझन में हो सकता हूं।jQuery डिफर्ड: एक पूर्ण फ़िल्टर के भीतर से वादा को अस्वीकार करना

return doAJAXRequest().then(function (data) { 
    if (data.responseText == "YES") { 
     return doOtherAJAXRequest(); 
    } else { 
     this.reject(data); 
    } 
}); 

कि काम नहीं किया, जैसा कि मैंने उम्मीद:

Uncaught TypeError: Object #<Object> has no method 'reject' 

वैसे भी, मैं एक AJAX अनुरोध है कि मैं प्रतिक्रिया की सामग्री पर आधारित एक किया फिल्टर के भीतर से अस्वीकार करना चाहते है

मैं इस प्रतिक्रिया के आधार पर यह वादा कैसे विफल कर सकता हूं? क्या यह संभव है? या क्या मैं सिर्फ इस बारे में उलझन में हूं कि यहां क्या करने की आवश्यकता है?

+0

इसे बदलने का प्रयास करें। $ (इस) को अस्वीकार करें। अस्वीकार करें। – rtimoshenko

+0

@rtimoshenko क्या आप वाकई सही हैं? – alex

+0

@rtimoshenko यह काम नहीं कर रहा प्रतीत होता है, मुझे अभी भी एक ही त्रुटि मिल रही है। संपादित करें: वास्तव में यह बिल्कुल वही नहीं है, लेकिन फिर भी बहुत समान है। ('अनकॉट टाइप एरर: ऑब्जेक्ट [ऑब्जेक्ट ऑब्जेक्ट] में कोई विधि' अस्वीकार नहीं 'है) – Ajedi32

उत्तर

31

jQuery में (कुछ अन्य libs के विपरीत), 'हल किए गए' राज्य से 'अस्वीकृत' राज्य से एक वादा transmogrifying थोड़ा verbose है, स्पष्ट निर्माण और एक नए deferred अस्वीकार करने की आवश्यकता है।

function foo() { 
    return doAJAXRequest().then(function (data, textStatus, jqXHR) { 
     if (data.responseText == "YES") { 
      return doOtherAJAXRequest(data); 
     } else { 
      return $.Deferred().reject(jqXHR, data, 'Not YES').promise(); 
     } 
    }); 
) 

यहाँ, वादा, अगर data.responseText !== "YES" की नकल करता है (आंशिक रूप से) एक असफल ajax अनुरोध लौटे जबकि अभी भी अनुमति देता है data पारित होने के लिए। डाउनस्ट्रीम .fail() हैंडलर के लिए यह संभवतः (महत्वपूर्ण) महत्वपूर्ण है, जो वास्तविक अजाक्स असफलताओं और ट्रांसमोग्रिफाइड सफलता की स्थितियों को संभालने में सक्षम होना चाहिए, यह जानने के बिना कि errorThrown पढ़ने तक कौन सा हुआ।

foo().fail(function(jqXHR, textStatus, errorThrown) { 
    if(errorThrown == 'Not YES') { 
     //transmogrified success 
     var data = textStatus; 
     ... 
    } 
    else { 
     //genuine ajax failure 
     ... 
    } 
}); 

यह आम तौर पर इस तरह के बजाय उसे jqXHR वस्तु से फिर से प्राप्त करने में data पारित करने के लिए आसान है। यह जेएसओएन एन्कोडेड डेटा के साथ विशेष रूप से सच है, जो अन्यथा विफल हैंडलर में दूसरी बार डीकोड करने की आवश्यकता होगी।

+2

मुझे नहीं लगता कि वादा() भाग की आवश्यकता है (या अब नहीं), जो कॉल को बनाता है थोड़ा कम बदसूरत/लम्बी। – mikus

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