2013-11-02 14 views
17

के साथ कोणीय जेएस में एक वादा घोषित करना मैं $ http सेवा के समान कुछ करने की कोशिश कर रहा हूं। मेरी समझ से $ http एक वादा वस्तु वापस।नामांकित सफलता/त्रुटि कॉलबैक

जब यह सिंटैक्स का उपयोग है:

$http(...).success(function(data)) { 
    //success callback 
}).error(function(data)) { 
    //error callback 
}) 

मैं सिर्फ एक ही है लेकिन विचार करना मेरी एपीआई GetUserProfile है चाहते हैं, तो मैं वाक्य रचना करना चाहते हैं:

GetUserProfile(...).success(function(data) { 
    // success callback 
}).error(function(data)) { 
    // error callback 
}) 

कैसे कर सकते हैं मैं एक वादा का उपयोग कर पूरा करता हूँ?

function GetUserProfile() { 
    var deferred = $q.defer(); 
    var promise = deferred.promise; 

    // success condition 
    if (!true) { 
     deferred.resolve('data'); 
    // error condition 
    } else { 
     deferred.reject('error'); 
    } 

    promise.success = function(fn) { 
     promise.then(fn); 
     return promise; 
    } 

    promise.error = function(fn) { 
     promise.then(null, fn); 
     return promise; 
    } 

    return promise; 
} 

GetUserProfile() 
    .success(function(data) { 
     console.log(data); 
    }) 
    .error(function(error) { 
     console.error(error); 
    }); 
+0

आप एक बार देख ले सकता है कैसे लागू करता (https [इस '$ http' में] Angular.js पर:। // GitHub .com/कोणीय/Angular.js/ब्लॉब/v1.2.0-rc.3/src/एनजी/http.js # L701)। – TheHippo

उत्तर

27

खुला स्रोत के साथ अच्छी बात यह है कि आप स्रोत पढ़ सकते हैं:

+0

अच्छा :) धन्यवाद! –

+3

मुझे आश्चर्य है कि कोणीय में मूल $ q क्यों नहीं है। –

+1

प्रतिक्रिया इंटरसेप्टर [बहिष्कृत] हैं (https://code.angularjs.org/1.2.20/docs/api/ng/service/$http#response-interceptors-deprecated-) 1.3+ में, लेकिन वही अवधारणा अभी भी लागू होती है । कुछ ऐसा उपयोग करें: 'promise.success = function (fn) {वापसी वादा। (एफएन); }); वादा। आतंक = कार्य (एफएन) {वापसी वादा। फिर (शून्य, एफएन); }); ' – nwayve

9

आप $ q सेवा का उपयोग करें और बना सकते हैं और GetUserProfile में अपने स्वयं के वादा लौटना ही होगा। यहाँ कैसे $ http सेवा यह करता है:

promise.success = function(fn) { 
    promise.then(function(response) { 
     fn(response.data, response.status, response.headers, config); 
    }); 
    return promise; 
    }; 

    promise.error = function(fn) { 
    promise.then(null, function(response) { 
     fn(response.data, response.status, response.headers, config); 
    }); 
    return promise; 
    }; 
+0

मुझे इसके बारे में पता है .. लेकिन फिर भी $ http में उपयोग की गई सफलता/त्रुटि वाक्यविन्यास यहां लागू नहीं होगा। या शायद यह होगा? सफलता/त्रुटि वाक्यविन्यास डिफ़ॉल्ट रूप से उपयोग किया जाता है जब एक वादा वापस आ जाता है? –

+1

मैंने सवाल को गलत समझा। नहीं, वादे ऑब्जेक्ट में डिफ़ॉल्ट रूप से सफलता और त्रुटि विधियां नहीं होती हैं। – katranci

+0

मैंने अपना जवाब संपादित कर लिया है और वादा ऑब्जेक्ट में सफलता/त्रुटि विधियों को जोड़ा है। – katranci

9

आप परिवर्तन स्रोत कोड की जरूरत नहीं है। कोणीय कोणीय में किसी भी सेवा को बदलने का एक तरीका प्रदान करता है जिसमें $ q शामिल है।

$ offer.decorator आपकी आवश्यकता के लिए बिल्कुल सही है यहां मेरा कोड है।

app.module पर डाल ('...') config

$provide.decorator('$q', function($delegate) { 
    function httpResponseWrapper(fn) { 
    return function(res) { 
     if (res.hasOwnProperty('data') && res.hasOwnProperty('status') && res.hasOwnProperty('headers') && res.hasOwnProperty('config') && res.hasOwnProperty('statusText')) { 
     return fn(res.data, res.status, res.headers, res.config, res.statusText); 
     } else { 
     return fn(res); 
     } 
    }; 
    }; 
    function decorator(promise) { 
    promise.success = function(fn) { 
     return decorator(promise.then(httpResponseWrapper(fn))); 
    }; 
    promise.error = function(fn) { 
     return decorator(promise.then(null, httpResponseWrapper(fn))); 
    }; 
    return promise; 
    }; 
    var defer = $delegate.defer; 
    $delegate.defer = function() { 
    var deferred = defer(); 
    decorator(deferred.promise); 
    return deferred; 
    }; 
    return $delegate; 
}); 
+0

यह करने के लिए अधिकांश प्रतिक्रियाएं एक साथ वादे के वादे की क्षमता को तोड़ती हैं जबकि आपका समाधान उस क्षमता को संरक्षित करता है, मैं आपका उत्तर पसंद करता हूं। –

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