我发现很难理解"延迟反模式".我认为我原则上理解它,但我没有看到一个超级简单的例子,一个服务,一个不同的承诺和一个反模式,所以我想我会尝试自己做但看到我不是超级了解它我先得到一些澄清.
我在工厂(SomeFactory)中有以下内容:
//url = 'data.json';
return {
getData: function(){
var deferred = $q.defer();
$http.get(destinationFactory.url)
.then(function (response) {
if (typeof response.data === 'object') {
deferred.resolve(response.data);
} else {
return deferred.reject(response.data);
}
})
.catch(function (error) {
deferred.reject(error);
});
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
我检查它的对象的原因只是在上面添加一个简单的验证层 $http.get()
以下,在我的指令中:
this.var = SomeFactory.getData()
.then(function(response) {
//some variable = response;
})
.catch(function(response) {
//Do error handling here
});
Run Code Online (Sandbox Code Playgroud)
现在我的理解是,这是一个反模式.因为原始的延期承诺会捕获错误并简单地吞下它.它不会返回错误,因此当调用此"getData"方法时,我已经执行了另一个捕获错误的捕获.
如果这不是反模式,那么有人可以解释为什么两者都要求各种"回调"吗?当我第一次开始写这个工厂/指令时,我预计不得不在某个地方做一个默认的承诺,但我没有预料到必须.catch()
在两边(也就是我有点想我可以让工厂返回响应或错误,如果我做了一个SomeFactory.getData()
angularjs angularjs-directive angularjs-service angular-promise
我有一个像下面这样的路线保护
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router, private authenticationSvc: AuthenticationService) { }
canActivate(): Observable<boolean> {
return this.authenticationSvc.getAuthenticatedUser().map(
r => {
if (this.authenticationSvc.isAuthenticated()) {
// logged in so return true
return true;
}
this.router.navigateByUrl('/login');
return false;
})
}
Run Code Online (Sandbox Code Playgroud)
问题是有时getAuthenticatedUser返回401,我有一个http拦截器来处理401并重定向到登录页面.问题是这个.map永远不会解析,因为http请求会抛出错误,并且角度路由器会卡在第一个路由请求上,无法处理来自拦截器的后续请求.如何处理此错误并将Observable返回的解析为false并保持移动?
getAuthenticatedUser() {
let getUserObservable = this.http.get(ApiUrl + 'security/getAuthenticatedUser')
.map((res: any) => res.json())
.share()
//Get the result for the cache
getUserObservable.subscribe(
r => {
if (r.success) {
this.authenticatedUser = r.result.user;
}
});
//return the observable
return getUserObservable;
}
Run Code Online (Sandbox Code Playgroud)
和http-intercepter下面 …