2011-02-24 10 views
14

मैं अपने सर्वर के तरीकों के साथ इंटरफ़ेस के लिए एक ajax उपयोगिता बनाने रहा हूँ। मैं jQuery.ajax() कॉल से लौटाई गई ऑब्जेक्ट से jQuery 1.5+ स्थगित विधियों का लाभ उठाना चाहता हूं। स्थिति का पालन कर रहा है।jQuery jqXHR - श्रृंखलित रद्द कॉल, ट्रिगर त्रुटि श्रृंखला

{ success: true|false, data: ... }

  • क्लाइंट साइड उपयोगिता शुरू की इस

    var jqxhr = $.ajax({ ... });

  • और समस्या की तरह ajax कॉल:

    1. serverside विधि हमेशा एक JSON ऑब्जेक्ट क्षेत्र:

      jqxhr.success(function(data, textStatus, xhr) { 
          if(!data || !data.success) { 
           ???? // abort processing, trigger error 
          } 
      }); 
      return jqxhr; // return to caller so he can attach his own handlers 
      

    तो सवाल यह है कि सभी कॉलर्स के आह्वान को रद्द करने के साथ जोड़ दिया सफलता जगह ???? साथ उल्लेख में एक ट्रिगर उसकी त्रुटि हैंडलर कॉलबैक है?

    प्रलेखन कहते हैं आस्थगित समारोह मंगलाचरण सूचियों फीफो हैं, इसलिए मेरी सफलता हैंडलर निश्चित रूप से पहले से एक है।

  • उत्तर

    29

    (अद्यतन:। कृपया ध्यान दें कि वर्तमान में jQuery वादे Promises/A+ specification साथ संगत नहीं हैं - this answer में अधिक जानकारी)

    अपने समारोह में जहां AJAX अनुरोध बनाने के आप भी एक आस्थगित वस्तु बना सकते हैं और अपने संकल्प को बंधन के बाद फोन करने वाले के लिए एक वादा लौट सकते हैं और कुछ कस्टम डेटा सत्यापन के साथ $ .ajax अनुरोध की उचित कॉलबैक करने के लिए कार्यों को अस्वीकार कर देते हैं:

    function makerequest() { 
    
        var deferred = $.Deferred(); 
        var promise = deferred.promise(); 
    
        var jqxhr = $.ajax({ 
         // ... 
        }); 
    
        jqxhr.success(function(data, status, xhr) { 
         if (!data || !data.success) { 
          deferred.reject(jqxhr, 'error'); 
         } else { 
          deferred.resolve(data, status, xhr); 
         } 
        }); 
    
        jqxhr.error(function(jqXHR, status, error) { 
         deferred.reject(jqXHR, status, error); 
        }); 
    
        return promise; 
    } 
    

    अब किसी को भी हो सकता है

    var request = makerequest(); 
    
    request.done(successCallback); 
    request.fail(errorCallback); 
    

    या यहां तक ​​कि बस: (

    promise.success = promise.done; 
        promise.error = promise.fail; 
    

    तो अपने कॉलर होगा:

    makerequest().then(successCallback, errorCallback); 
    

    आप भी जोड़ इस यदि आपके कार्य करने के लिए इस तरह के किसी भी वादा की तरह उपयोग करने में सक्षम शायद अधिक परिचित) .success के इंटरफेस() और शुद्ध $ .ajax साथ .त्रुटि() की तरह() कहता है:

    var request = makerequest(); 
    
    request.success(successCallback); 
    request.error(errorCallback); 
    

    (.complete() का कार्यान्वयन पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है।

    यहाँ एक और उदाहरण एक काम परियोजना से सीधे खींच लिया है::)

    इस डेमो देखें

    function ajax(url, data) { 
        var self = this; 
        var deferred = $.Deferred(); 
        var promise = deferred.promise(); 
    
        var jqxhr = $.ajax({ 
         url: url, 
         data: JSON.stringify(data), 
         contentType: "application/json; charset=utf-8", 
         dataType: 'json', 
         type: 'POST' 
        }).done(function (msg, status, xhr) { 
         if (!msg || msg.Error) { 
          self.doError(msg.Error); 
          deferred.reject(jqxhr, 'error'); 
         } else { 
          deferred.resolve(msg, status, xhr); 
         } 
        }); 
    
        return promise; 
    } 
    
    +4

    ** कृपया ध्यान दें **: यह उत्तर फरवरी '11 दिनांकित है, जिस समय jQuery jQuery v1.5 पर था। JQuery के बाद के सुधार इस जवाब को अनावश्यक बनाते हैं। V1.6 से, आम तौर पर स्वीकृत समाधान में 'deferred.pipe() 'और v1.8' deferred.then()' से शामिल होगा, जिस बिंदु पर हम 'function makerequest() {return jqxhr.then जैसे कुछ लिखेंगे। (फ़ंक्शन (डेटा) {वापसी (डेटा और डेटा.success)? jqxhr: $। डिफर्ड() अस्वीकार करें (नई त्रुटि ('AJAX डेटा त्रुटि'))। वादा();}); } '। –

    +0

    जैसे ही हम कुछ वापस लौटना शुरू करते हैं, 'jqXHR' के बराबर नहीं है (जैसे '$। डिफर्ड()। ऊपर दिए गए उत्तर में वादा'), हम मूल' jqXHR' ऑब्जेक्ट के '.abort()' फ़ंक्शन तक पहुंच को खो देते हैं और कर सकते हैं यदि आवश्यक हो, तो इसे हल करने से पहले अनुरोध को रद्द न करें। –