我正在尝试创建一个工厂,对某些API发出ajax请求,然后返回一个数据对象。我的代码是:
app.factory('Test', function($http, $q) {
var data = {response:{}};
var getMessages = function() {
$http.get('https://someapi.com').then(
function(jsonAPI) {
var dataObj = {};
var messages = [];
$.each(jsonAPI.data.data, function(x, data) {
dataObj[x] = data;
$.each(jsonAPI.data.included, function(y, included) {
if(data.relationships.sender.data.id == included.id) {
dataObj[x].sender = included;
}
});
messages.push(dataObj[x]);
});
data.response = messages;
},
function(errorResponse) {
// todo handle error.
}
);
};
getMessages();
return {
data
};
});
但是,当我尝试从创建的数据对象中删除'response'属性并且data = messages
而不是data.response = messages
时,数据对象没有被填充。如果我在我的控制器中保留响应属性,当我尝试console.log(Test.data['response'])
时,我得到一个空对象。 console.log(Test.data)
返回一个有效的对象。我在这里缺少什么?
答案 0 :(得分:1)
如果您想保存存储在工厂中的数据,您可以存储$http
返回的承诺,并将该承诺与存储的数据一起解决。
app.factory('Test', function($http, $q) {
var data = null, dataPromise = null;
function getMessages() {
if (!dataPromise) {
dataPromise = $http.get('https://someapi.com').then(
function (jsonAPI) {
var dataObj = {};
var messages = [];
$.each(jsonAPI.data.data, function (x, data) {
dataObj[x] = data;
$.each(jsonAPI.data.included, function (y, included) {
if (data.relationships.sender.data.id == included.id) {
dataObj[x].sender = included;
}
});
messages.push(dataObj[x]);
});
data = messages;
return data;
},
function (errorResponse) {
// todo handle error.
}
);
}
return dataPromise
}
return {
getMessages : getMessages
};
});
然后在任何控制器或指令中或解决:
Test.getMessages().then(function(messages){
$scope.messages = messages;
});