2015-03-13 14 views
16

Trong ứng dụng của tôi, tôi sử dụng một đánh chặn để bắt tất cả các lỗi phản ứng http, như:angularJS: 404 tuỳ chỉnh đánh chặn xử lý - phản ứng với url

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); 
}; 

Và khi tôi đi đến bộ điều khiển của tôi (khi phương pháp getArticles tôi trả về một số dữ liệu, không phải 404 - khi mảng bài viết trống) tất cả đều OK: 404 bị bắt gặp skipException == true.

Nhưng khi mảng bài viết của tôi trống thì máy chủ trả về 404 và khi tôi nhập bộ điều khiển này, tôi không thể nhận được response.config.url - không có phản hồi nào bị bắt, nhưng tại sao? Tôi nghĩ rằng kẻ đánh chặn sẽ bắt được tất cả các phản ứng.

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

$scope.getArticles có mã ví dụ:

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

dịch vụ:

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; 
}; 

Làm thế nào tôi có thể có điều kiện nắm bắt 404 của tùy thuộc vào URL? Bởi vì điều này:

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

Không phải lúc nào cũng hoạt động.

+2

Kiểm tra logic bằng URL có vẻ sai. Dường như bạn nên có các Dịch vụ và Dịch vụ khác nhau cho các hành vi đánh chặn khác nhau, Phương thức Dịch vụ nên gọi các trình chặn khác nhau gọi các Trình giải quyết Lỗi khác nhau. Một trong các Trình giải quyết Lỗi nên xử lý các lỗi của 404 và trình gỡ lỗi khác sẽ bỏ qua 404. Phương thức dịch vụ nên quyết định điều này. Logic ghép nối với âm thanh của URL giống như vi phạm SoC. –

+0

bạn có thể chia sẻ mã đầy đủ của phản hồi lỗi – harishr

+1

@DaveAlperovich bạn có thể cung cấp ví dụ với các trình chặn khác nhau trong trường hợp của tôi không? – brabertaser19

Trả lời

1

như vậy ... tôi đã làm nó như vậy:

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

Từ documentation:

Một mã trạng thái phản ứng giữa 200 và 299 được coi là một trạng thái thành công và sẽ dẫn đến việc gọi lại thành công được gọi.

Vì máy chủ trả về 404, chức năng responseError được gọi. Thật không may, tham số cấu hình không có sẵn để bạn không thể thực hiện bất kỳ logic điều kiện nào dựa trên url yêu cầu trong đó.

1

Trong "phản ứng" bạn shoud kiểm tra url Đáp lại, không response.config.url .. một cái gì đó như thế này:

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

ở cấp câu trả lời bạn không có config

2

bạn có thể kiểm tra Restangular, có thể hữu ích cho mục đích của bạn. Nó có các phương thức đánh chặn tốt được tích hợp. Cho dù nó thực sự tốt cho bạn sẽ phụ thuộc vào việc bạn đang sử dụng một API RESTful hay không. https://github.com/mgonto/restangular

2

Trong một nỗ lực để được dễ bảo trì hơn và mở rộng đối với bất kỳ $ gọi dịch vụ http người ta có thể làm điều này:

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

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

} 
Các vấn đề liên quan