Я попытался построить службу, которая вернет $ ресурс после того, как служба аутентифицирована. Я сделал это так:AngularJS defer вернуться до завершения
.factory('MoltinApi', ['$q', '$resource', '$http', 'moltin_options', 'moltin_auth', function ($q, $resource, $http, options, authData) {
var api = $resource(options.url + options.version + '/:path', {
path: '@path'
});
var authenticate = function() {
if (!options.publicKey)
return;
var deferred = $q.defer();
var request = {
method: 'POST',
url: options.url + 'oauth/access_token',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: "grant_type=implicit&client_id=" + options.publicKey
};
$http(request).success(function (response) {
authData = response;
deferred.resolve(api);
});
return deferred.promise;
};
return authenticate();
}])
Но я не могу назвать этот ресурс в моем контроллере:
.controller('HomeController', ['MoltinApi', function (moltin) {
var self = this;
moltin.get({ path: 'categories' }, function (categories) {
console.log(categories);
});
}]);
он просто заявляет, что "не определено не является функцией. Может кто-нибудь сказать мне, что я делаю неправильно?
Update 1
Таким образом, после игры с раствором, который был предложен, это результат.
angular.module('moltin', ['ngCookies'])
// ---
// SERVICES.
// ---
.factory('MoltinApi', ['$cookies', '$q', '$resource', '$http', 'moltin_options', function ($cookies, $q, $resource, $http, options) {
var api = $resource(options.url + options.version + '/:path', {
path: '@path'
});
var authenticate = function() {
if (!options.publicKey)
return;
var deferred = $q.defer();
var authData = angular.fromJson($cookies.authData);
if (!authData) {
console.log('from api');
var request = {
method: 'POST',
url: options.url + 'oauth/access_token',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: "grant_type=implicit&client_id=" + options.publicKey
};
deferred.resolve($http(request).success(function (response) {
$cookies.authData = angular.toJson(response);
setHeaders(response.access_token);
}));
} else {
console.log('from cookie');
deferred.resolve(setHeaders(authData.access_token));
}
return deferred.promise;
};
var setHeaders = function (token) {
$http.defaults.headers.common['Authorization'] = 'Bearer ' + token;
}
return authenticate().then(function (response) {
return api;
});
}]);
и назвать его, я должен сделать это:
.controller('HomeController', ['MoltinApi', function (moltin) {
var self = this;
moltin.then(function (api) {
api.get({ path: 'categories' }, function (categories) {
console.log(categories);
self.sports = categories.result;
});
});
}]);
но то, что я хотел бы сделать это:
.controller('HomeController', ['MoltinApi', function (moltin) {
var self = this;
moltin.get({ path: 'categories' }, function (categories) {
console.log(categories);
}, function (error) {
console.log(error);
});
}]);
Как вы можете видеть, служба проверки чтобы убедиться, что мы прошли аутентификацию перед возвратом API. После того, как он аутентифицирован, API возвращается, а затем пользователь может вызвать api без повторной аутентификации. Может кто-нибудь помочь мне реорганизовать эту услугу, чтобы я мог ее назвать без необходимости moltin.then()?
так как я могу вернуть ресурс api $ после того, как «аутентификация прошла успешно или не удалось? – r3plica
верните функцию аутентификации, но не вызывайте ее, а в контроллере вызовите ее. Я не вижу, что вам нужна услуга $ resource, если вы используете службу $ http. Используйте один, $ http или $ resource – Raulucco
Я не хочу вызывать функцию аутентификации в контроллере. Я хочу, чтобы он аутентифицировался при создании экземпляра службы перед выполнением любых других вызовов. – r3plica