如何在 angular js 中为服务器错误和成功编写全局函数
How to write global function for server error and success in angular js
我有一个单独的功能,如提交、更新、删除。对于所有函数
$http[method](url)
.then(function(response) {
$scope.successMessage = true;
} , function(response) {
$scope.errorMessageWrong=true;
});
html
<p ng-show="successMessage">Success</p>
<p ng-show="errorMessageWrong"> Something went wrong </p>
用于单独的功能。我需要显示相应的消息。但我不想重复更新、删除和提交的代码,甚至不想重复执行相同操作的其他页面的代码。
如何创建名为 errorHandler 之类的函数。这样我就可以重用它。
谁能帮帮我
您可以为此使用服务并在各种控制器中共享。 $http 也是一种服务。但是如果你想向数据添加更多内容,你可以创建一个新服务并将 $http 注入它。
how to create function called errorHandler
or something. so that i can reuse it.
创建 chainable 承诺,通过 返回 完成的数据响应和 throwing 拒绝的错误响应。
下面的示例函数将 httpPromise 作为参数,将成功或错误消息放在 $scope 上,returns 适合链接的承诺。
function errorHandler(httpPromise) {
var derivedPromise = httpPromise
.then(function onFulfilled(response) {
$scope.successMessage = true;
//return response for chaining
return response;
},
function onRejected(errorResponse) {
$scope.errorMessageWrong = true;
//throw error to chain rejection
throw errorResponse;
});
//return derivedPromise for chaining
return derivedResponse;
};
然后在客户端代码中:
var httpPromise = $http[method](url);
errorHandler(httpPromise).then( function (response) {
//use data
});
客户端代码保存来自 $http
服务调用的 httpPromise,使用 errorHandler
函数处理承诺,并使用 errorHandler
函数返回的派生承诺。
因为调用承诺的 then
方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。这使得实现强大的 API 成为可能。1
如果您希望它在您的应用程序中是全局的,那么您可以使用 httpInterceptor。
您必须创建拦截器服务,然后将拦截器添加到 app.config() 中的 $httpProvider。
创建拦截器服务:
angular.module('app').factory('myInterceptorService', myInterceptorService);
function myInterceptorService($q){
var errorMessage;
var bShowHideWatchFlag;
return{
requestError: requestError,
responseError: responseError,
showFlag: bShowFlag,
errorMessage: errorMessage
};
function requestError(rejection){
errorMesasge = 'Request error';
bShowHideWatchFlag = true;
$q.reject(rejection);
return;
}
function responseError(rejection){
errorMesasge = 'Response error';
bShowHideWatchFlag = true;
$q.reject(rejection);
return;
}
}
要注册应用程序配置,请将 $httpProvider 添加到 app.config
app.config([...,'$httpProvider'...){
$httpProvider.interceptor.push('myInterceptorService');
}
在您的控制器中,您必须将手表绑定到服务 showFlag:
$scope.$watch( function () { return myInterceptorService.showFlag; },
function (oldval,newval) {
if( oldval!=newval){
$scope.errorMessage = myInterceptorService.errroMessage;
$scope.showMessage = newval;
}
}, true);
我有一个单独的功能,如提交、更新、删除。对于所有函数
$http[method](url)
.then(function(response) {
$scope.successMessage = true;
} , function(response) {
$scope.errorMessageWrong=true;
});
html
<p ng-show="successMessage">Success</p>
<p ng-show="errorMessageWrong"> Something went wrong </p>
用于单独的功能。我需要显示相应的消息。但我不想重复更新、删除和提交的代码,甚至不想重复执行相同操作的其他页面的代码。
如何创建名为 errorHandler 之类的函数。这样我就可以重用它。
谁能帮帮我
您可以为此使用服务并在各种控制器中共享。 $http 也是一种服务。但是如果你想向数据添加更多内容,你可以创建一个新服务并将 $http 注入它。
how to create function called
errorHandler
or something. so that i can reuse it.
创建 chainable 承诺,通过 返回 完成的数据响应和 throwing 拒绝的错误响应。
下面的示例函数将 httpPromise 作为参数,将成功或错误消息放在 $scope 上,returns 适合链接的承诺。
function errorHandler(httpPromise) {
var derivedPromise = httpPromise
.then(function onFulfilled(response) {
$scope.successMessage = true;
//return response for chaining
return response;
},
function onRejected(errorResponse) {
$scope.errorMessageWrong = true;
//throw error to chain rejection
throw errorResponse;
});
//return derivedPromise for chaining
return derivedResponse;
};
然后在客户端代码中:
var httpPromise = $http[method](url);
errorHandler(httpPromise).then( function (response) {
//use data
});
客户端代码保存来自 $http
服务调用的 httpPromise,使用 errorHandler
函数处理承诺,并使用 errorHandler
函数返回的派生承诺。
因为调用承诺的 then
方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。这使得实现强大的 API 成为可能。1
如果您希望它在您的应用程序中是全局的,那么您可以使用 httpInterceptor。
您必须创建拦截器服务,然后将拦截器添加到 app.config() 中的 $httpProvider。
创建拦截器服务:
angular.module('app').factory('myInterceptorService', myInterceptorService);
function myInterceptorService($q){
var errorMessage;
var bShowHideWatchFlag;
return{
requestError: requestError,
responseError: responseError,
showFlag: bShowFlag,
errorMessage: errorMessage
};
function requestError(rejection){
errorMesasge = 'Request error';
bShowHideWatchFlag = true;
$q.reject(rejection);
return;
}
function responseError(rejection){
errorMesasge = 'Response error';
bShowHideWatchFlag = true;
$q.reject(rejection);
return;
}
}
要注册应用程序配置,请将 $httpProvider 添加到 app.config
app.config([...,'$httpProvider'...){
$httpProvider.interceptor.push('myInterceptorService');
}
在您的控制器中,您必须将手表绑定到服务 showFlag:
$scope.$watch( function () { return myInterceptorService.showFlag; },
function (oldval,newval) {
if( oldval!=newval){
$scope.errorMessage = myInterceptorService.errroMessage;
$scope.showMessage = newval;
}
}, true);