google calendar api 可以在 angular 工厂中调用 return promise 吗?
Can google calendar api call return a promise inside angular factory?
我可以更改此代码以使其 return 成为承诺吗?
var calApi = {
fun3: function() {
gapi.auth.authorize(
{
'client_id': CLIENT_ID,
'scope': SCOPES.join(' '),
'immediate': true
}, calApi.fun2);
},
fun2: function(authResult) {
if (authResult && !authResult.error) {
calApi.fun4();
}
},
fun1: function(event) {
gapi.auth.authorize(
{client_id: CLIENT_ID, scope: SCOPES, immediate: false},
calApi.fun2);
return false;
},
fun4: function() {
gapi.client.load('calendar', 'v3', calApi.fun5);
},
fun5: function() {
// some code
// returning the result...
}
};
return calApi;
我的控制器:
$scope.hanleAPICall = function(event) {
factoryName.fun1(event);
};
此代码取自 google calendar api,我试图在 angularjs 工厂中实现它,但我需要 return 来自的事件的结果api 作为对事件的承诺 return,但我的页面内没有任何反应。
您可以执行以下操作以 return 服务承诺:
angular.module('app', [])
.factory('AppService', function ($q) {
return {
fun3: fun3
};
function fun3() {
var defer = $q.defer();
gapi.auth.authorize(
{
'client_id': CLIENT_ID,
'scope': SCOPES.join(' '),
'immediate': true
}, handleAuthResult);
function handleAuthResult (authResult) {
if (authResult && !authResult.error) {
defer.resolve(authResult);
} else {
defer.reject(authResult.error);
}
}
return defer.promise;
}
});
与上面类似,您可以为其他方法创建工厂方法fun1, fun2, fun4, fun5
你可以承诺一切,
你需要的(在我看来)是 gapi
库的包装器,仅此而已。
现在:
- 避免全局变量,创建两个常量(GAPI_CLIENT_ID, GAPI_SCOPES)
- 创建一个
[Service][1]
来执行 gapi
的操作,但以 angular 的方式。
这应该是对您的代码的一点重构...
function GapiServiceFactory($q, GAPI_CLIENT_ID, GAPI_SCOPES) {
var self = this;
/**
* @private
**/
self._authorize = function(immediate) {
var deferred = $q.defer();
var data = {
client_id: GAPI_CLIENT_ID,
scope: GAPI_SCOPES,
immediate: !!immediate
};
gapi.auth.authorize(data, function(result) {
if(Object.hasOwnProperty.call(result, 'error')) {
return deferred.reject(result);
}
return deferred.resolve(result);
});
return deferred.promise;
};
self.authorize = function() {
return self._authorize(false);
};
self.authorizeImmediate = function() {
return self._authorize(true);
};
self.loadCalendar = function() {
var deferred = $q.defer();
gapi.client.load('calendar', 'v3', function() {
if(/**What's the logic here? **/) {
return deferred.reject();
}
return deferred.resolve();
});
return deferred.promise;
};
}
angular
.module('Test', [])
.constant('GAPI_CLIENT_ID', 12333)
.constant('GAPI_SCOPES', ['read', 'write'])
.service('GapiService', GapiServiceFactory)
.controller('TestCtrl', function TestCtrl(GapiService) {
GapiService
.authorizeImmediate()
.then(
console.log.bind(console, 'Authorization success'),
console.log.bind(console, 'Authorization error')
)
;
GapiService
.loadCalendar()
.then(
console.log.bind(console, 'LoadCalendar success'),
console.log.bind(console, 'LoadCalendar error')
)
;
})
;
我可以更改此代码以使其 return 成为承诺吗?
var calApi = {
fun3: function() {
gapi.auth.authorize(
{
'client_id': CLIENT_ID,
'scope': SCOPES.join(' '),
'immediate': true
}, calApi.fun2);
},
fun2: function(authResult) {
if (authResult && !authResult.error) {
calApi.fun4();
}
},
fun1: function(event) {
gapi.auth.authorize(
{client_id: CLIENT_ID, scope: SCOPES, immediate: false},
calApi.fun2);
return false;
},
fun4: function() {
gapi.client.load('calendar', 'v3', calApi.fun5);
},
fun5: function() {
// some code
// returning the result...
}
};
return calApi;
我的控制器:
$scope.hanleAPICall = function(event) {
factoryName.fun1(event);
};
此代码取自 google calendar api,我试图在 angularjs 工厂中实现它,但我需要 return 来自的事件的结果api 作为对事件的承诺 return,但我的页面内没有任何反应。
您可以执行以下操作以 return 服务承诺:
angular.module('app', [])
.factory('AppService', function ($q) {
return {
fun3: fun3
};
function fun3() {
var defer = $q.defer();
gapi.auth.authorize(
{
'client_id': CLIENT_ID,
'scope': SCOPES.join(' '),
'immediate': true
}, handleAuthResult);
function handleAuthResult (authResult) {
if (authResult && !authResult.error) {
defer.resolve(authResult);
} else {
defer.reject(authResult.error);
}
}
return defer.promise;
}
});
与上面类似,您可以为其他方法创建工厂方法fun1, fun2, fun4, fun5
你可以承诺一切,
你需要的(在我看来)是 gapi
库的包装器,仅此而已。
现在:
- 避免全局变量,创建两个常量(GAPI_CLIENT_ID, GAPI_SCOPES)
- 创建一个
[Service][1]
来执行gapi
的操作,但以 angular 的方式。
这应该是对您的代码的一点重构...
function GapiServiceFactory($q, GAPI_CLIENT_ID, GAPI_SCOPES) {
var self = this;
/**
* @private
**/
self._authorize = function(immediate) {
var deferred = $q.defer();
var data = {
client_id: GAPI_CLIENT_ID,
scope: GAPI_SCOPES,
immediate: !!immediate
};
gapi.auth.authorize(data, function(result) {
if(Object.hasOwnProperty.call(result, 'error')) {
return deferred.reject(result);
}
return deferred.resolve(result);
});
return deferred.promise;
};
self.authorize = function() {
return self._authorize(false);
};
self.authorizeImmediate = function() {
return self._authorize(true);
};
self.loadCalendar = function() {
var deferred = $q.defer();
gapi.client.load('calendar', 'v3', function() {
if(/**What's the logic here? **/) {
return deferred.reject();
}
return deferred.resolve();
});
return deferred.promise;
};
}
angular
.module('Test', [])
.constant('GAPI_CLIENT_ID', 12333)
.constant('GAPI_SCOPES', ['read', 'write'])
.service('GapiService', GapiServiceFactory)
.controller('TestCtrl', function TestCtrl(GapiService) {
GapiService
.authorizeImmediate()
.then(
console.log.bind(console, 'Authorization success'),
console.log.bind(console, 'Authorization error')
)
;
GapiService
.loadCalendar()
.then(
console.log.bind(console, 'LoadCalendar success'),
console.log.bind(console, 'LoadCalendar error')
)
;
})
;