Используйте функцию разрешения $routeProvider внутри другой

У меня есть три функции обещания решения внутри моего $routeProvider. Мой вопрос в том, могу ли я использовать функцию getData внутри функции загрузки, например, чтобы получить ответ на HTTP-запрос!

Также будет ли angular ждать завершения getData, а затем перейти к загрузке? Делает их по порядку и ждет обещаний!?

$routeProvider.when = function(path, route) {
        route.resolve = {
            getData: ['$http', function ($http) {
                var http = $http({
                    method: 'POST',
                    url: 'a URL',
                    data: {
                        route: "/something"
                    },
                    headers: {
                        'something': 'anything'
                    }
                });
                return http;
            }],
            load: [
                'getData',
                function(getData) {
                    console.log(getData);
                    // I'm Actually returning a promise here so no problem at all.
                }
            ],
            prefData: [
                '$preflightService',
                function($preflightService) {
                    console.log('Preflight Run');
                    return $preflightService.run();
                }
            ],
        };
        return originalWhen(path, route);
    };

Используя этот код выше, я получаю эту ошибку в консоли

Error: [$injector:unpr] http://errors.angularjs.org/1.4.12/$injector/unpr?p0=getDataProvider%20%3C-%20getData

Что я должен делать?!

Должен ли я как-то определить провайдера!?


person mamsoudi    schedule 30.08.2016    source источник


Ответы (1)


Каждое разрешение разрешается асинхронно. Если вы хотите, чтобы данные возвращались функцией «getData» для разрешения запроса «загрузить», сделайте это одним разрешением, например так:

loadData: ['$http', function($http) {
      return $http({
        method: 'POST',
        url: 'a URL',
        data: {
          route: "/something"
        },
        headers: {
          'something': 'anything'
        }
      }).then(function(response){
        // getData result available here
        return // Return the load promise here
      });
    }

При необходимости вы можете прикрепить обработчик успеха (.then(function(){}) к обещанию загрузки и вернуть настраиваемый объект, содержащий как результаты getData, так и результаты загрузки, например

return {
 getData: getResp,
 loadedData: loadResp
}

которые будут доступны в контроллере.

person T J    schedule 30.08.2016