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

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

Также будет ли угловое ожидание окончания 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

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

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

1 ответ

Решение

Каждое решение разрешается асинхронно. Если вы хотите, чтобы данные, возвращаемые getData, для разрешения запроса load, делали одно разрешение, примерно так:

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
}

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

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