0

У меня есть поставщик, который выглядит примерно так:

angular.module('myProvider', function(){ 
    var appUrl = '' 
    this.setAppUrl = function(url){ 
    appUrl = url; 
    } 
    this.$get = ['$http', function($http){ 
    return { 
     appAction: function(){ 
     $http.get(appUrl).then(function(response){ 
      //do stuff 
     }); 
     } 
    } 
    }] 
}); 

В настоящее время приложение устанавливает appUrl в блоке .config на основе констант сгенерирована как часть сборки процесс с использованием grunt ngconstant.

Я пытаюсь изменить приложение, чтобы загрузить файл конфигурации из json-файла через $ http. Провайдер теперь выглядит примерно так:

angular.module('myProvider', function(){ 
    this.$get = ['$http', function($http){ 
    return $http.get('path/to/config.json').then(function(response){ 
     appUrl = response.appUrl; 
     return { 
     appAction: function(){ 
      $http.get(appUrl).then(function(response){ 
      //do stuff 
      }); 
     } 
     } 
    }); 
    }] 
}); 

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

+0

Как вы ожидаете, что это сработает? Вы выполняете операцию async, и modus operandus должен использовать обещание. Вы не можете (и не должны) блокировать обещание, и вы не можете рассматривать его как синхронный вызов. –

+0

Сохраните исходный код. Когда приложение загружается, загрузите файл config.json, затем установитеAppUrl с ответом.appUrl – Hoyen

+0

@Hoyen Если я что-то пропустил, вы не можете использовать $ http в блоке .config. – biagidp

ответ

1

Метод службы возвращает обещание в любом случае; поэтому мы сохраняем значение appUrl: если оно не пустое, мы используем его для извлечения наших данных. В противном случае мы связываем обещания: сначала извлекаем конфигурацию, а затем извлекаем реальные данные. Что-то вроде следующего:

angular.module('myProvider', function(){ 
    this.$get = ['$http', function($http){ 
    var appUrl; 

    function retrieveTheRealData() { 
     return $http.get(appUrl).then(function(response){ 
     //do stuff 
     }); 
    } 

    return { 
     appAction: function() { 
     if(appUrl) { 
      return retrieveTheRealData(); 
     } 
     else { 
      return $http.get('path/to/config.json').then(function(response){ 
      appUrl = response.appUrl; 
      return retrieveTheRealData(); 
      }); 
     } 
     } 
    }; 
    }] 
});