谷歌日历 api 调用可以在角度工厂内返回承诺吗?
Can google calendar api call return a promise inside angular factory?
我可以更改此代码以返回承诺吗?
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);
};
这段代码取自谷歌日历 API,我试图在 AngularJS 工厂中实现它,但我需要从 API 返回事件的结果作为承诺,因为 IM 返回事件,但我的页面内什么也没发生。
您可以执行以下操作来返回服务中的承诺:
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
所做的事情。
这应该是对代码的一点重构......
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')
)
;
})
;
相关文章:
- 工厂返回数据后未设置角度$scope
- 从角度工厂返回数据,返回对象后填充数据
- AngularJS:从工厂返回配置
- 努力将结果从工厂返回到范围
- 控制器未从工厂返回数据
- 角度控制器/工厂返回未定义的对象
- JavaScript 对象原型未通过工厂返回
- 从工厂返回控制器$http承诺时未定义
- 离子平台准备就绪后,从棱角分明的工厂返回
- 如何将对象从使用PouchDB的工厂返回到控制器
- AngularJS工厂返回类型未定义
- angularjs从工厂返回数组
- Angular JS,工厂返回数据,但在控制器中它消失了
- Ionic角工厂返回undefined
- 如何在angularjs中使用http get从工厂返回业务对象
- 在Angular中从工厂返回响应到控制器
- AngularJS从工厂返回值到控制器
- AngularJS工厂返回State对象,而不是promise中的JSON数据
- Angular工厂返回index.html作为响应.data而不是JSON
- 不能使用AngularJS工厂返回的数据