背景
我正在使用Angular。我有一个名为UserService的服务,用于处理登录、认证和用户数据请求。
get
方法需要在进行get
请求之前检查用户是否具有有效(未过期)的身份验证令牌。
如果是,则进行请求,如果不是,则请求一个令牌,然后进行请求。
问题
这个get
方法需要隐藏其复杂的请求。它必须仅返回Promise,就像只进行了一个请求一样。
因此,以下是使用示例:
UserService
.get()
.then(data => { ... })
.catch(error => { ... })
错误解决方案
检查令牌是否已过期。如果已过期,请返回请求以刷新令牌,在那里进行并返回GET请求。如果未过期,只需进行并返回GET请求。如下所示:
function get() {
if (isTokenExpired(token))
return $http
.post(url + '/refreshtoken', 'token=' + refreshToken)
.then(response => {
token = response.data.token
return $http.get(url + '?token=' + token)
})
.catch(response => { ... })
else
return $http.get(url + '?token=' + token)
}
但是它返回一个Promise,我需要像这样处理它:
UserService
.get()
.then(request => {
request // THAT IS NOT GOOD
.then(data => { ... })
.catch(error => { ... })
})
.catch(error => { ... })
任何类似使用示例的内容!
正确的解决方案
如何在处理身份验证的服务上创建此get
方法,并将其隐藏在将使用它的控制器中,使其与使用示例一样简单?
then
回调中的request
是一个Promise。 - Bergi