2015-03-16 2 views
0

Я попытался построить службу, которая вернет $ ресурс после того, как служба аутентифицирована. Я сделал это так: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()?

ответ

0

Вы возвращаете вызов функции аутентификации на заводе MoltinApi, поэтому вы возвращаете обещание. И метод get не существует в обещании

+0

так как я могу вернуть ресурс api $ после того, как «аутентификация прошла успешно или не удалось? – r3plica

+0

верните функцию аутентификации, но не вызывайте ее, а в контроллере вызовите ее. Я не вижу, что вам нужна услуга $ resource, если вы используете службу $ http. Используйте один, $ http или $ resource – Raulucco

+0

Я не хочу вызывать функцию аутентификации в контроллере. Я хочу, чтобы он аутентифицировался при создании экземпляра службы перед выполнением любых других вызовов. – r3plica

Смежные вопросы