วิธีจัดการข้อผิดพลาด $ resource service ใน AngularJS


96

ฉันกำลังส่งคำขอไปยัง API ของฉันและฉันใช้โมดูลทรัพยากร AngularJS $ มันแตกต่างจาก $ http ดังนั้นฉันจึงไม่รู้วิธีจัดการกับข้อผิดพลาดของฉัน

บริการของฉัน:

var appServices = angular.module('app.services', ['ngResource']);
appServices.factory('Category', ['$resource',
    function($resource){
        return $resource('/apicategoryerr/?format=:format', {}, {
            query: {
                method: 'GET', 
                params: { format: 'json'}, 
                isArray: true,

            }
        });
    }]);

ตัวควบคุมของฉัน:

...
Category.query(function(data) {
                console.log(data);
            });
...

ฉันต้องการอะไรแบบนี้หรือ .. ฉันไม่รู้วิธีจัดการกับข้อผิดพลาดหาก API ของฉันไม่ทำงาน ..

Category.query().success(function() {
                console.log('success');
            }).error(function() {
                console.log('error');
            });

คำตอบ:


180

queryคุณสามารถส่งผ่านจัดการข้อผิดพลาดเป็นพารามิเตอร์ที่สองที่จะ

Category.query(function(data) {}, function() {});

แก้ไข:

เพื่อให้สิ่งต่างๆชัดเจนขึ้นตัวอย่างบางส่วน:

var Resource = $resource('/restapi/resource');

Resource.query(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query({
    'query': 'thequery'
},function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query().$promise.then(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query({
    'query': 'thequery'
}).$promise.then(function(data) {
    // success handler
}, function(error) {
    // error handler
});

2
ในเอกสารดูเหมือนว่าพารามิเตอร์ที่ 3 คือการเรียกกลับข้อผิดพลาด "Resource.action ([พารามิเตอร์], [สำเร็จ], [ข้อผิดพลาด])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
มีวิธีกำหนดตัวจัดการข้อผิดพลาดเริ่มต้นสำหรับการใช้ทรัพยากรนี้ทั้งหมดหรือไม่ (เช่น "ทรัพยากรไม่ได้รับอนุญาตจากเซิร์ฟเวอร์" หรือไม่
Nicolas Janel

2
@NicolasJanel Resource.query().$promise.then(function(data) {}, errorFunction)คุณสามารถกำหนดฟังก์ชั่นที่จะจัดการกับมันแล้วทำ คุณยังคงต้องรวมไว้ในทุก ๆ ที่ที่คุณใช้แบบสอบถาม แต่อย่างน้อยคุณจะไม่ต้องกำหนดใหม่ทุกครั้ง
schillingt

@valkirilov ฉันจะขอบคุณถ้าคุณยอมรับสิ่งนี้เป็นคำตอบสำหรับคำถามนี้
marco.eig

2
@ Kaspar ค่าตอบแทนของวิธีการอินสแตนซ์เช่นmyResource.$saveและmyResource.$deleteเป็นสัญญา myResource.$save().then(...)ดังนั้นคุณก็สามารถทำได้
Carl G

68

คุณสามารถกำหนดตัวจัดการข้อผิดพลาดในขั้นตอนการสร้างทรัพยากรโดยการเพิ่มinterceptorอ็อบเจ็กต์ในคำอธิบายของวิธีการพร้อมresponseErrorคุณสมบัติที่เชื่อมโยงกับฟังก์ชันข้อผิดพลาดของคุณ

function resourceErrorHandler(response) { ... }

$resource('/path/:param/', {} , 
{
        'get':    {method:'GET', 
                   interceptor : {responseError : resourceErrorHandler}},
        'save':   {method:'POST'},
        'query':  {method:'GET', isArray:true, 
                   interceptor : {responseError : resourceErrorHandler}},
        'remove': {method:'DELETE'},
        'delete': {method:'DELETE'}
};

โดยที่resourceErrorHandlerฟังก์ชั่นที่เรียกใช้กับข้อผิดพลาดแต่ละข้อใน get หรือ query method สำหรับปัญหาที่ถามวิธีรับเป็นสิ่งที่จำเป็นเท่านั้น แน่นอนคุณสามารถนำสิ่งนั้นไปใช้กับการกระทำใด ๆ

มีตัวสกัดกั้นอื่นresponseสำหรับทรัพยากร $ เพื่อตอบสนองตามปกติ

 {'get': {method:'GET', interceptor : {response : resourceResponseHandler}},

Interceptors เป็นส่วนหนึ่งของ$httpโมดูลคุณยังสามารถอ่านเกี่ยวกับพวกเขาในเอกสารของพวกเขา


1

นี่คือตัวอย่าง ES6 ใหม่ (ฉันใช้ TypeScript) บน ng.resource ของฉัน

resolve: {
    detail: function (myService, $stateParams) {
        return myService.getEventDetail({ id: $stateParams.id }).$promise.then(data => data, error => false );
    }
}

จากนั้นในคอนโทรลเลอร์ของฉัน 'รายละเอียด' ที่ฉีดเข้าไปในคอนโทรลเลอร์จะแก้ไขข้อมูล (ดี) หรือเป็นเท็จสำหรับข้อผิดพลาดที่ฉันจัดการกับการแสดงผล 404

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.