2012-06-01 14 views
12

मेरे पास $.ajax वादा है और यह जांचना है कि मेरी (वाक्य रचनात्मक रूप से वैध) प्रतिक्रिया में कोई त्रुटि है, उस स्थिति में अस्वीकृत स्थिति को ट्रिगर करना।jQuery की डिफरर्ड ऑब्जेक्ट में त्रुटि को फेंकना

मैंने अपनी खुद की वादा लाइब्रेरी के साथ काम किया है जो इस तरह के कार्यों को आसानी से सौदा करता है। मुझे वास्तव में jQuery के Promise (cache) को Deferred object के साथ कार्यान्वित नहीं करना चाहिए और शायद कुछ अनदेखा हो सकता है, क्योंकि मैं शायद ही कभी इसका उपयोग करता हूं। मुझे लगता है कि जाने के लिए बस .then(), जो लगता है जिस तरह से उपयोग कर रहा है बल्कि जटिल:

return $.ajax(...).then(function success(response) { 
    var problem = hasError(response); 
    if (problem) { 
     var error = new $.Deferred; 
     error.reject(problem); 
     return error; 
    } else 
     return response; 
}); 

यह एक वादा है जो नेटवर्क त्रुटि या प्रतिक्रिया के साथ समस्याओं के मामले में अस्वीकार कर दिया है वापस आ जाएगी। लेकिन एक अस्वीकार कर दिया गया है वास्तव में [केवल | सबसे अच्छा | सबसे छोटा] रास्ता तय करने के लिए?

मैं भी AJAX विकल्पों में ऐसे "त्रुटि-फेंकने वाले प्रतिक्रिया हैंडलर" से निपटने के तरीके पर सहायता की सराहना करता हूं, मुझे उनके बारे में अच्छा दस्तावेज नहीं मिला।


अस्वीकरण: नहीं, मैं सर्वर प्रतिक्रियाओं को बदल नहीं सकता। समस्या-पहचान विधि तुल्यकालिक है। मैं अन्य पुस्तकालयों का उपयोग नहीं करना चाहता, मैं विशेष रूप से जिस तरह से jQuery हल करता हूं उसमें दिलचस्पी लेता हूं।

+0

ठीक है, 'के साथ तो फिर()' मैं बात यह है कि '.pipe()' में करता है मतलब jQuery :-( – Bergi

+0

Jquery 1.8 पाइप === फिर – Plynx

+0

हां, शुक्र है कि उन्हें कम से कम तय किया गया है। – Bergi

उत्तर

31

अब सफलता या डेटा की विफलता के आधार पर फ़िल्टर करने के लिए .then के माध्यम से $.ajax की प्रतिक्रिया को चलाने के लिए jQuery 1.8+

के लिए अद्यतन सबसे आसान तरीका है इस से निपटने के लिए किया गया है।

$.ajax() 
    .then(function (response) { 
     return $.Deferred(function (deferred) { 
      var problem = hasError(response); 

      if (problem) { 
       return deferred.reject(problem) 
      } 

      deferred.resolve(response); 
     }).promise(); 
    }); 

फिर आप जो कुछ भी बुला कोड इस का उपभोग होगा के लिए इस नए वादा लौट सकता है:

var request = function() { 
    return $.ajax() 
     .then(function (response) { 
      return $.Deferred(function (deferred) { 
       var problem = hasError(response); 

       if (problem) { 
        return deferred.reject(problem) 
       } 

       deferred.resolve(response); 
      }).promise(); 
     }); 
}; 

request() 
    .done(function (response) { 
     // handle success 
    }) 
    .fail(function (problem) { 
     // handle failure 
    }); 
+0

पाइप के बीच क्या अंतर है और फिर? – Bergi

+1

'पाइप 'आपको किसी भी पंजीकृत वादे हैंडलरों को भेजे जाने से पहले स्थगित मूल्यों को फ़िल्टर करने की अनुमति देता है। 'तो' वास्तव में केवल वादा करने वालों को पंजीकृत करने के लिए उपयोग किया जाता है जब कोई वादा हल करता है या अस्वीकार करता है। – Eli

+1

नहीं, [विनिर्देशन द्वारा] (http://webcache.googleusercontent.com/search?q=cache%3awiki.commonjs.org/wiki/Promises/A) .then() ठीक वही करेगा। या jQuery ने इसे फेंक दिया और विधि नाम बदल दिया? – Bergi

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