内部解析函数返回诺言作为其延续
上下文
我正在和Angular合作。 我有一个名为UserService的服务,用于处理登录,身份验证和用户数据请求。
在get
请求之前, get方法需要检查用户是否有用于认证的有效(未过期)令牌。 所以,如果有的话,做出请求,如果没有请求一个令牌, 然后发出请求。
问题
这个get方法需要隐藏它的复杂请求。 它只能返回一个Promise,因为它只提出一个请求。
所以,一个使用的例子:
UserService
.get()
.then(data => { ... })
.catch(error => { ... })
错误的解决方案
检查令牌是否过期。 如果是,则返回刷新令牌的请求,并在那里创建并返回获取请求。 如果不是,只需制作并返回获取请求。 如下:
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)
}
但它回复了我将不得不像这样处理的一个承诺:
UserService
.get()
.then(request => {
request // THAT IS NOT GOOD
.then(data => { ... })
.catch(error => { ... })
})
.catch(error => { ... })
像使用示例一样!
正确的解决方案
如何让服务获得方法,处理这种认证,并隐藏将使用的控制器的所有内容,让它像使用示例中那样?
但是,它承诺我将不得不像这样处理一个承诺:
UserService.get().then(request => { request.then(data => { … }) })
没有。
承诺做链条,任何“承诺承诺”都将被隐含地平息为对内在结果的承诺。 你的“错误解决方案”代码只是按原样工作。
这是一个例子。 基本上你需要转换一个额外的.then()
angular.module('app', [])
.service('UserService', function($http) {
let url = 'https://jsonplaceholder.typicode.com';
function getUserData(token) {
return $http.get(url + '/users/1', {
token: token
})
.then(resp => resp.data);
}
this.get = function(tokenIsValid) {
if (!tokenIsValid){
console.log('refreshing');
return $http.post(url + '/posts', {
refreshToken: 'rt'
})
.then(getUserData)
}
return getUserData();
}
return this;
})
.run(function($rootScope, UserService) {
$rootScope.get = (valid) => {
console.log('Getting with ' + (valid? '':'in') + 'valid token');
UserService.get(valid)
.then(console.log)
.catch(console.error);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
<button ng-click="get()">Get invalid</button>
<button ng-click="get(true)">Get valid</button>
</div>
链接地址: http://www.djcxy.com/p/37789.html
上一篇: Return promise inside resolve function as its continuation