AngularJS: как инициализировать сервис с асинхронными данными c и внедрить его в зависимый сервис - PullRequest
0 голосов
/ 27 марта 2020

У меня похожая ситуация, как в AngularJS: Инициализировать службу с асинхронными данными , но мне нужно внедрить мою базовую службу с асинхронными данными в зависимые службы. Выглядит это так:

Базовый сервис:

angular.module('my.app').factory('baseService', baseService);

baseService.$inject = ['$http'];

function baseService($http) {
    var myData = null;

    var promise = $http.get('api/getMyData').success(function (data) {
        myData = data;
    });

    return {
        promise: promise,
        getData: function() {
            return myData;
    }};
}

Зависимый сервис (в который я внедряю базовый сервис)

angular.module('my.app').factory('depentService', depentService);

depentService.$inject = ['baseService'];

function depentService(baseService) {
    var myData = baseService.getData();
    ....

    return {...};
}

Маршрут:

    angular.module('my.app', ["ngRoute"])
    .config(function ($routeProvider) {
        $routeProvider.when('/',
            {
                resolve: {
                    'baseService': function (baseService) {
                        return baseService.promise;
                    }
                }
            });
    });

Но ничего не происходит, baseService.getData() по-прежнему возвращает ноль (coz asyn c вызов API все еще выполняется). Похоже, моя конфигурация ngRoute недействительна, но я не могу указать какой-либо контроллер / шаблон в нее. Как правильно разрешить свой baseService и получить данные в службе Depend?

1 Ответ

2 голосов
/ 27 марта 2020

Зависимые сервисы должны работать с обещаниями и возвращать обещания:

angular.module('my.app').factory('depentService', depentService);

depentService.$inject = ['baseService'];

function depentService(baseService) {
    ̶v̶a̶r̶ ̶m̶y̶D̶a̶t̶a̶ ̶=̶ ̶b̶a̶s̶e̶S̶e̶r̶v̶i̶c̶e̶.̶g̶e̶t̶D̶a̶t̶a̶(̶)̶;̶
    var promise = baseService.promise;

    var newPromise = promise.then(function(response) {
        var data = response.data;
        //...
        var newData //...
        return newData;
    }); 

    return newPromise;
}

Попытка использовать необработанные данные приводит к риску возникновения условий, когда зависимый сервис работает до того, как первичные данные возвращаются с сервера.

Из документов:

Метод .then возвращает новое обещание, которое разрешается или отклоняется через возвращаемое значение successCallback, errorCallback (если это значение не является обещанием, в в этом случае он разрешается со значением, которое разрешается в этом обещании с использованием цепочка обещаний ).

- AngularJS $ q Справочник по API службы - API Promise

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...