Ваш завод ничего не возвращает.В службе вы присоединяете свои функции и члены к this
, но на фабрике вы должны что-то возвращать.
Я вижу, что у вас есть оператор возврата в блоке .finally()
, но это ничего не делает дляваша фабрика, так как этот код не находится в области действия до тех пор, пока фабрика не будет создана.
Лично я бы отказался от блока .finally()
, так как он не дает вам никаких дополнительных преимуществ:
app.factory('myFactory', '$http', function($http) {
var myMap = {};
var apiPromise;
// this will only run once as soon as the factory is instantiated
// and will store the resolution of the call for future use
apiPromise = $http({
method: 'GET',
url: 'url',
headers: {'Content-Type': '*/*'}
}).then(function (response) {
for (var i in response.data) {
myMap[response.data[i].key] = response.data[i].value;
}
});
return {
getMyValue: function(key) {
// apiPromise prevents this function from returning until $http call is complete
// but will not cause the $http call to run again
return apiPromise.then(function() {
return myMap[key];
});
}
};
});
Чтобы использовать это, вы должны рассматривать возвращаемое значение как обещание.а не значение:
MyFactory.getMyValue(key).then(function(myMap) {
console.log(myMap);
});