2015-03-13 7 views
16

मेरी ऐप्लिकेशन में साथ प्रतिक्रिया मैं एक इंटरसेप्टर का उपयोग सभी http प्रतिक्रिया त्रुटियों को पकड़ने के लिए, जैसे:AngularJS: कस्टम 404 इंटरसेप्टर संभाल - यूआरएल

var response = function(response) { 
    if(response.config.url.indexOf('?page=') > -1) { 
    skipException = true; 
    } 
    return response; 
} 

var responseError = function(rejection) { 
    if (rejection.status === 401 || rejection.status === 403) { 
    /**/ 
    } 
    else if (rejection.status >= 500 || rejection.status === 0) { 
    /**/ 
    } 
    else if (rejection.status === 404 && !skipException) { 
    /**/ 
    } 
    else if (rejection.status === 404 && skipException) { 
    /**/ 
    } 
    else{ 
    /**/ 
    } 
    return $q.reject(rejection); 
}; 

और जब मैं अपने नियंत्रक के पास जाओ (जब मेरे getArticles विधि कुछ देता है डेटा, 404 नहीं - जब लेख सरणी खाली होती है) सब ठीक है: 404 skipException == true पकड़ा गया है।

लेकिन जब मेरे लेख सरणी खाली होती है तो सर्वर 404 देता है और जब मैं इस नियंत्रक में प्रवेश करता हूं तो मुझे response.config.url नहीं मिल सकता - कोई प्रतिक्रिया नहीं पकड़ी जाती है, लेकिन क्यों? मैंने सोचा कि इंटरसेप्टर सभी प्रतिक्रियाओं को पकड़ लेगा।

$timeout(function() { 
     $scope.getArticles(); 
    }, 100); 

और $scope.getArticles इस तरह के कोड है:

getDataService.getArticles($scope.pageNum).then(function(response) { 
/**/ 
}); 

सेवा:

var getEventsByScrollService = function(num) { 
    var deferred = $q.defer(); 
    $http.get(***, { 

    }) 
    .success(function(response) { 
     deferred.resolve(response); 
    }).error(function(err, status) { 
     if (status === 404){ 
     deferred.resolve([]); 
     } 
     else{ 
     deferred.reject(err); 
     } 
    }); 
    return deferred.promise; 
}; 

मैं कैसे सशर्त 404 का यूआरएल के आधार पर पकड़ कर सकते हैं? क्योंकि यह:

if(response.config.url.indexOf('?page=') > -1) { 

हमेशा काम नहीं करता है।

+2

यूआरएल द्वारा तर्क जांचना गलत लगता है। ऐसा लगता है कि अलग-अलग इंटरसेप्टर व्यवहारों के लिए आपके पास अलग-अलग सेवाएं और सेवा विधियां होनी चाहिए, सेवा विधियों को अलग-अलग इंटरसेप्टर्स को कॉल करना चाहिए जो विभिन्न त्रुटि समाधानों को कॉल करते हैं। त्रुटि समाधानकर्ताओं में से एक को 404 को संभालना चाहिए और दूसरे को 404 के अनदेखा करना चाहिए। सेवा विधि को यह तय करना चाहिए। एसओसी के उल्लंघन की तरह यूआरएल की आवाज़ के साथ युग्मन तर्क। –

+0

क्या आप त्रुटि-प्रतिक्रिया – harishr

+1

@DaveAlperovich का पूरा कोड साझा कर सकते हैं क्या आप मेरे मामले में विभिन्न इंटरसेप्टर के साथ उदाहरण प्रदान कर सकते हैं? – brabertaser19

उत्तर

1

तो ... मैं इसे ऐसा किया है:

if(rejection.config.url.indexOf('?page=') > -1) { 
     skipException = true; 
    } 
-1

documentation से:

एक प्रतिसाद स्थिति कोड 200 और 299 के बीच एक सफलता स्थिति माना जाता है और सफलता कॉलबैक बुलाया जा रहा है का परिणाम देगा।

चूंकि सर्वर 404 देता है, responseError फ़ंक्शन को कॉल किया जाता है। दुर्भाग्यवश, कॉन्फ़िगर पैरामीटर उपलब्ध नहीं है, इसलिए आप वहां अनुरोध यूआरएल के आधार पर कोई सशर्त तर्क नहीं कर सकते हैं।

1

"प्रतिक्रिया" आप प्रतिक्रिया url की जांच shoud में, response.config.url नहीं .. में कुछ इस तरह: प्रतिक्रिया स्तर पर

var response = function(response) { 
    if(response.url.indexOf('?page=') > -1) { 
     skipException = true; 
    } 
    return response; 
} 

आप config

2

की जरूरत नहीं है आप Restangular की जांच कर सकते हैं, आपके उद्देश्यों के लिए उपयोगी हो सकता है। इसमें अच्छी इंटरसेप्टर विधियां हैं। चाहे यह आपके लिए वास्तव में अच्छा है, भले ही आप एक विश्वसनीय API का उपयोग कर रहे हों या नहीं। https://github.com/mgonto/restangular

2

के प्रयास में और अधिक maintainable और किसी भी $ http सेवा कॉल एक ऐसा कर सकता है के लिए बढ़ाई होने के लिए:

// Service call 
$http.get({url:'/?page=', ignoreErrors: true}) 

// Interceptor 
if(rejection.status === 404 && !rejection.config.ignoreErrors) { 

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