我有一个REST后端,它提供了API方法的散列图。这允许前端使用键名映射到API方法,而不需要知道整个REST URL。
例如:
{
CHARGE.GET_CHARGE_INFO: /provider/charge/getChargeInfo/{{providerId}}/{{chargeId}}
CHARGE.LIST_CHARGES: /provider/charge/listCharges/{{providerId}}
CHARGE.LIST_TYPES: /provider/charge/listTypes
}
有一项服务负责从REST API加载hashmap。
app.service('preloader', function ($http, globals, $interpolate, $q) {
var self = this;
var endPointsList = $http.get(globals.apiPath + globals.endPointsPath, {}).success(function (data) {
self.endPoints = data;
});
return {
endPointsList: endPointsList,
getResourceEndPoint: function( endPoint ){
if (!self.endPoints[endPoint]) {
// To avoid misleading errors
throw ("Endpoint not found. \r\nEndpoint: " + endPoint + "\r\nFound: " + self.endPoints[endPoint]);
}
// reformat
return globals.apiPath + self.endPoints[endPoint].replace(/{{([^}]+)}}/g, ":$1");
}
};
我试图编写一个使用此服务的$resource
,但问题是当服务注入工厂时,它尚未初始化,因此调用该方法来检索端点抛出错误。
app.factory('providerFactory', ['$resource', 'preloader',
function ($resource, preloader) {
return $resource( "", null,
{
"getTypes" : {
method: 'GET',
url: preloader.getResourceEndPoint('PROVIDER.LIST_TYPES')
},
"get": {
method: 'GET',
url: preloader.getResourceEndPoint('PROVIDER.GET_PROVIDER_INFO'),
params: {
providerId: '@providerId'
}
}
}
);
});
错误消息:
TypeError: Cannot read property 'PROVIDER.LIST_TYPES' of undefined
at Object.getResourceEndPoint (http://localhost:8888/client.git/build/app.min.js:3:8967)
如果我单步执行代码,我会看到工厂的preloader.getResourceEndPoint()
调用在服务完成endPointsList
的初始化之前调用服务。
我该怎么做才能避免这个问题?我必须使用$q
承诺吗?这样的事情似乎有些过分。如果是这样,我不得不怀疑这是否是正确的方法来使这样的东西工作,但我不知道使用什么方法。
我还在学习AngularJS,所以我并不完全确定正确的方法。我继承了这段代码,所以如果它看起来很复杂/没有任何复杂性,我会很高兴看到如何改进它。