Введение решенного обещания в сервис

Мне нужно получить некоторую информацию (схему) с сервера, прежде чем я настрою группу сервисов, которые зависят от этой информации.

Мой сервер предоставляет схему, которая определяет различные свойства модели. В моем угловом коде у меня есть сервис, который получает эту схему:

services.factory('schema', function($q, $http) {
    var deferred = $q.defer();
        $http.get('schema/').then(function(response) {
        schema = // some function of response.data
        deferred.resolve(schema);
    }, function() {
        deferred.reject('There was a problem fetching the schema');
    }); 
        return deferred.promise;
});

Я хотел бы внедрить объект схемы, а не обещание, в другие службы, которые зависят от схемы. $routeProvider позволяет нам сделать это для контроллеров:

app.config(function($routeProvider) {
    $routeProvider.
        when('/', {
            controller: 'SomeCtrl',
            resolve: {
                schema: 'schema'
            },
            ...
        });
});

и это позволяет мне определить SomeCtrl следующим образом:

controllers.controller('SomeCtrl', function($scope, schema) {
    // schema is an object
    ...
});

Но для услуг я должен сделать:

services.factory('SomeService', function(schema) {
    // schema is a promise
    schema.then(function(schema) {
        ...
    });
});

Есть ли способ, которым я могу сделать это?

2 ответа

То, что вы хотите, это отложенный начальный загрузчик. Для этого уже создан плагин - https://github.com/philippd/angular-deferred-bootstrap.

Я создаю пример на plunkr - http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

* Вы должны заменить существующее приложение ng на отложенную загрузку

Фрагмент кода -

angular.element(document).ready(function() {
    deferredBootstrapper.bootstrap({
        element: document.body,
        module: 'plunker',
        resolve: {
            schema: ['$http',
                function($http) {
                    return $http.get('schema.json');
                }
            ]
        }
    });
});

Затем вы можете использовать схему в любом случае в контроллере, службах или на фабрике, как при разрешении маршрута.

Образец кода для фабрики

app.factory('SomeService', function(schema){
    return {
        getTitle: function() {
            return schema.title;
        }
    }
});

Вы получаете обещание, потому что ваша сервисная функция сразу же оценивает его тело при вызове (как это делают функции). Обычно служба должна возвращать объект, чтобы потребитель (другая служба, контроллер и т. Д.) Мог затем вызывать функции этого объекта, когда это необходимо.

services.factory('schema', function($q, $http) {
return {
  get: function() {
    var deferred = $q.defer();
    $http.get('schema/').then(function(response) {
      schema = // some function of response.data
      deferred.resolve(schema);
    }, function() {
      deferred.reject('There was a problem fetching the schema');
    });
    return deferred.promise;
  }
}

});

Другие вопросы по тегам