Điều này có vẻ như là một yêu cầu lạ. Tôi đã tự hỏi nếu có một cách sử dụng một $ http đánh chặn để bắt URL đầu tiên có một tình trạng phản ứng của 500, sau đó dừng lại tất cả các yêu cầu và quy trình tiếp theo và làm điều gì đó?AngularJS: Bắt tất cả trạng thái phản hồi 500
Trả lời
Bạn có thể xem tất cả câu trả lời qua $httpProvider.responseInterceptors
.
Để thực hiện điều này, bạn phải tạo một nhà máy như thế này:
app.factory('SecurityHttpInterceptor', function($q) {
return function (promise) {
return promise.then(function (response) {
return response;
},
function (response) {
if (response.status === 500) {
//DO WHAT YOU WANT
}
return $q.reject(response);
});
};
});
Trong nhà máy này, bạn sẽ nắm bắt được tình trạng phản ứng nếu nó 500 làm những gì bạn muốn. Sau đó từ chối phản hồi.
Bây giờ bạn cần phải đặt nhà máy trong responseInterceptors
của $httProvider
trong mô-đun cấu hình của bạn như thế:
app.config(function ($routeProvider, $httpProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/home.html',
controller: 'HomeCtrl'
})
.otherwise({
templateUrl: 'views/404.html'
});
$httpProvider.responseInterceptors.push('SecurityHttpInterceptor');
})
Bạn có thể tạo ra một dịch vụ và đánh chặn để đối phó với điều này,
.factory('ServerErrorService', function() {
var _hasError = false
return {
get hasError() {
return _hasError;
},
set hasError(value) {
_hasError = value;
// you could broadcast an event on $rootScope to notify another service that it has to deal with the error
},
clear: clear
}
function clear() {
_hasError = false;
}
})
.factory('ServerErrorInterceptor', function ($q, ServerErrorService) {
var interceptor = {
request: function(config) {
if(ServerErrorService.hasError) {
var q = $q.defer();
q.reject('prevented request');
return q.promise;
}
return config;
},
responseError: function(response) {
if(response.status === 500) {
ServerErrorService.hasError = true;
}
return $q.reject(response);
}
}
return interceptor;
})
Nếu bạn muốn cho phép yêu cầu được thực hiện lại sau đó bạn chỉ cần gọi ServerErrorService.clear()
HOẶC
Bạn có thể sử dụng phiên bản sửa đổi của câu trả lời này. Mặc dù tôi không chắc chắn cách thức - nếu bạn muốn - bạn sẽ hủy hành động này và cho phép các yêu cầu tiếp theo.
https://stackoverflow.com/a/25475121/1798234
.factory('ServerErrorInterceptor', function ($q) {
var canceller = $q.defer();
var interceptor = {
request: function(config) {
config.timeout = canceller.promise;
return config;
},
responseError: function(response) {
if(response.status === 500) {
canceller.resolve('server error');
}
return $q.reject(response);
}
}
return interceptor;
})
Một điều cần nhớ cho cả các giải pháp này, nếu bạn có bất kỳ máy bay đánh chặn khác sau này mà có một phương pháp responseError
xác định hoặc bất kỳ bộ xử lý thiết lập với .catch
để xử lý các lời hứa $ http, họ sẽ nhận được một đối tượng phản hồi với {data:null, status:0}
Thomas answer là chính xác, nhưng giải pháp này hiện tại là không được dùng nữa. Bạn nên làm một cái gì đó như thế này answer.
app.factory('errorInterceptor', function ($q) {
var preventFurtherRequests = false;
return {
request: function (config) {
if (preventFurtherRequests) {
return;
}
return config || $q.when(config);
},
requestError: function(request){
return $q.reject(request);
},
response: function (response) {
return response || $q.when(response);
},
responseError: function (response) {
if (response && response.status === 401) {
// log
}
if (response && response.status === 500) {
preventFurtherRequests = true;
}
return $q.reject(response);
}
};
});
app.config(function ($httpProvider) {
$httpProvider.interceptors.push('errorInterceptor');
});
- 1. Cách nhận trạng thái phản hồi jQuery.ajax?
- 2. Mã trạng thái phản hồi web
- 3. Làm cách nào để phản hồi bộ định tuyến phản hồi với mã trạng thái 404?
- 4. Cách nhận mã trạng thái phản hồi từ jQuery.ajax?
- 5. Phản hồi, cách cập nhật trạng thái nhanh chóng
- 6. Trạng thái phản hồi của Khách hàng Jersey 204
- 7. Phản hồi HTTP 500 với Thân máy?
- 8. Tất cả trạng thái vùng chứa Docker?
- 9. Phản hồi OCSP không cung cấp Trạng thái chứng chỉ
- 10. Phản hồi - đặt trạng thái ban đầu từ api
- 11. AngularJS bắt tất cả tuyến đường?
- 12. Trang lỗi trả lại mã trạng thái 200 phản hồi mặc định
- 13. XMLHttpRequest luôn gọi trình nghe sự kiện "tải", ngay cả khi phản hồi có trạng thái lỗi
- 14. IIS ghi đè văn bản phản hồi HTTP khi trạng thái phản hồi HTTP được đặt là 400
- 15. Django - trang thử nghiệm cho 500 trạng thái
- 16. Mã trạng thái lỗi trang web SSRS 500
- 17. Nhận mã trạng thái 500 http trống từ API Web
- 18. Làm cách nào để hiển thị trạng thái tải theo phần trăm cho phản hồi ajax?
- 19. Vô hiệu hóa tất cả nội dung phản hồi lỗi HTTP mặc định trong Tomcat
- 20. Mô hình phản hồi cho các mã trạng thái cụ thể bằng cách sử dụng Swagger
- 21. Tìm tất cả việc sử dụng trạng thái phiên
- 22. Kết hợp: tạo tất cả "trạng thái" - kết hợp mảng
- 23. Buộc phản hồi HTTP để trả lại Trạng thái 200 trong Rails
- 24. Sự khác biệt giữa mã trạng thái phản hồi http 402 và 403
- 25. Ứng dụng bận sẽ dẫn đến trạng thái "Không phản hồi" trên Windows 7 - WM_UPDATE
- 26. Lỗi HTTP 500 với 121 trạng thái phụ có nghĩa là gì?
- 27. Thử nghiệm sử dụng NSURLConnection với trạng thái lỗi phản hồi HTTP
- 28. Java HTTPUrlConnection trả lại 500 mã trạng thái
- 29. Lỗi trong WebSocket handshake: mã phản hồi mong đợi: 500
- 30. Trạng thái xử lý (ví dụ: 503) trong phản hồi Axios OPTIONS
Xin lỗi tôi đã nói rằng tôi biết cách tạo một kẻ đánh chặn, tôi đã tự hỏi liệu có cách nào thực sự "dừng" hàng đợi $ http.pendingRequests trong lần đầu tiên trạng thái 500 gặp phải không. –
Tôi cũng đang tìm một giải pháp để dừng tất cả các yêu cầu tiếp theo khi phát hiện một mã trạng thái nhất định (403 trong trường hợp của tôi). Tôi đã có một thiết bị đánh chặn được thiết lập, nhưng không biết làm thế nào để tiếp tục từ đó. Hãy chia sẻ nếu bạn có một giải pháp cho điều này, cảm ơn. – Mark