[英]AngularJs : Callback or promise in a service using conditions
我有一個特殊的情況,我不確定是否應該實現回調或Promise。 我對諾言完全陌生,只是開始了解其概念。 因此,我不想陷入反抗 。
我也閱讀並重新閱讀了有角度的文檔$ q 。
這就是我想要實現的:
如果使用諾言:
OauthService.token().then(function(access_token){
config.url = config.url+'?access_token='+access_token;
});
return config;
如果使用回調:
OauthService.token(function(access_token){
config.url = config.url+'?access_token='+access_token;
});
return config;
如果Oauth服務實際上有一些條件,它不僅是一個http請求,可能會讓我認為我應該使用回調而不是promises。
所以這里我的服務現在使用回調。
OauthService.js:
app.factory('OauthService', function($http, $localStorage) {
return {
token : function(callback){
// Get actual token
access_token = $localStorage.getObject('access_token');
// Get actual identity
identity_token = $localStorage.getObject('identity_token');
// IF no user logged
if(isObjectEmpty(identity_token)){
// IF access_token does NOT exist OR will expires soon
if( isObjectEmpty(access_token) || Date.now() > (access_token.expires_at - (600*1000)) ){
// Create an anonymous access_token
$http
.get(domain+'/oauth/v2/token?client_id='+public_id+'&client_secret='+secret+'&grant_type=client_credentials')
.then(function (response) {
$localStorage.setObject('access_token', {
key: response.data.access_token,
type: 'anonymous',
expires_at: Date.now()+(response.data.expires_in*1000)
});
// return access token here
callback(response.data.access_token);
});
}
}
// IF user is logged
else{
// IF access_token does NOT exist OR will expires soon OR is anonymous
if( isObjectEmpty(access_token) || Date.now() > (access_token.expires_at - (600*1000)) || access_token.type == 'anonymous' ){
// Create an access_token with an identity
$http
.get(domain+'/oauth/v2/token?client_id='+public_id+'&client_secret='+secret+'&api_key='+identity_token+'&grant_type=http://oauth2.dev/grants/api_key')
.then(function (response) {
$localStorage.setObject('access_token', {
key: response.data.access_token,
type: 'identity',
expires_at: Date.now()+(response.data.expires_in*1000)
});
// return access token here
callback(response.data.access_token);
});
}
}
// return access token here (if the previous token has not changed of type or expired)
callback(access_token.key);
}
};
})
因此,如果我寧願遵守承諾,我應該如何執行呢?
在操作中具有條件與回調與諾言無關。 普通的回調是執行異步操作的一種卑鄙的方式,您應盡可能使用Promise。
您可以重寫token
方法以使用如下所示的promise:
app.factory('OauthService', function($http, $localStorage, $q) {
return {
token : function(callback){
// Get actual token
access_token = $localStorage.getObject('access_token');
// Get actual identity
identity_token = $localStorage.getObject('identity_token');
// IF no user logged
if(isObjectEmpty(identity_token)){
// IF access_token does NOT exist OR will expires soon
if( isObjectEmpty(access_token) ||
Date.now() > (access_token.expires_at - (600*1000)) ){
// Create an anonymous access_token
return $http
.get(domain+'/oauth/v2/token?client_id='+public_id +
'&client_secret=' + secret + '&grant_type=client_credentials')
.then(function (response) {
$localStorage.setObject('access_token', {
key: response.data.access_token,
type: 'anonymous',
expires_at: Date.now() +
(response.data.expires_in * 1000)
});
return response.data.access_token;
});
}
}
// IF user is logged
else {
// IF access_token does NOT exist OR will expire soon OR is anonymous
if( isObjectEmpty(access_token) ||
Date.now() > (access_token.expires_at - (600*1000)) ||
access_token.type == 'anonymous' ){
// Create an access_token with an identity
return $http
.get(domain+'/oauth/v2/token?client_id='+public_id+'&client_secret='+secret +
'&api_key='+identity_token+'&grant_type=http://oauth2.dev/grants/api_key')
.then(function (response) {
$localStorage.setObject('access_token', {
key: response.data.access_token,
type: 'identity',
expires_at: Date.now()+
(response.data.expires_in * 1000)
});
return response.data.access_token;
});
}
}
// return access token here (if the previous token has not changed of type or expired)
return $q.when(access_token.key);
}
};
});
然后,您可以進行一些重構以將其簡化為:
app.factory('OauthService', function($http, $localStorage, $q) {
function expiresSoon(access_token) {
return Date.now() > (access_token.expires_at - (600*1000));
}
function getAccessToken(url, type) {
return $http
.get(url)
.then(function (response) {
$localStorage.setObject('access_token', {
key: response.data.access_token,
type: type,
expires_at: Date.now() +
(response.data.expires_in * 1000)
});
return response.data.access_token;
});
}
return {
token : function(callback){
// Get actual token
access_token = $localStorage.getObject('access_token');
// Get actual identity
identity_token = $localStorage.getObject('identity_token');
// IF no user logged
if(isObjectEmpty(identity_token)){
// IF access_token does NOT exist OR will expires soon
if( isObjectEmpty(access_token) || expiresSoon(access_token) ) {
var url = domain + '/oauth/v2/token?client_id=' + public_id +
'&client_secret=' + secret + '&grant_type=client_credentials';
// Create an anonymous access_token
return getAccessToken(url, 'anonymous');
}
}
// IF user is logged
else {
// IF access_token does NOT exist OR will expire soon OR is anonymous
if( isObjectEmpty(access_token) ||
expiresSoon(access_token) ||
access_token.type == 'anonymous' ){
var url = domain+'/oauth/v2/token?client_id=' + public_id+
'&client_secret='+secret +
'&api_key='+identity_token +
'&grant_type=http://oauth2.dev/grants/api_key';
// Create an access_token with an identity
return getAccessToken(url, 'identity');
}
}
// return access token here (if the previous token has not changed of type or expired)
return $q.when(access_token.key);
}
};
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.