我有一个类似于以下内容的提供程序:
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
});
}
}
}]
});
目前,该应用程序在.config块中根据使用grunt ngconstant生成的常量设置appUrl。
我正在尝试将应用程序更改为通过$http从json文件加载配置文件。提供商现在看起来像这样:
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
});
}
}
});
}]
});
这会从远程源加载配置,但会产生不必要的副作用,即返回promise而不是实际函数。在从提供者返回值之前,我曾尝试(未成功)解决承诺。我不想更改应用程序的其余部分以期望返回promise而不是函数。确保此方法返回函数的最佳方法是什么?
服务的appAction
方法无论如何都会返回promise;所以我们保留appUrl
的值:如果它不是null,我们就用它来检索我们的数据。否则,我们将连锁承诺:首先检索配置,然后检索真实数据。类似以下内容:
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();
});
}
}
};
}]
});