想要在角度工厂中创建数据对象,我可以返回控制器,但遇到一些问题:
app.factory('simpleFactory', function ($http) {
var mykey = 'akjhas3892kh8adsak9';
var apiResource = [{
type: 'type1',
abbr: 'abc'
}, {
type: 'type2',
abbr: 'efg'
}, {
type: 'type3',
abbr: 'hij'
}];
var data = {};
var setDataKeyValues = function (key, value) {
data[key] = value
};
for (var i = 0; i < apiResource.length; i++) {
var key = apiResource[i].type;
$http.get('http://api.com/v1/path/' + key + '/' + apiResource[i].abbr + '/anotherpath?apikey=' + mykey).success(function (info) {
setDataKeyValues(key, info);
});
}
return data;
});
Angular http请求正在返回一个JSON对象,但是当返回数据对象时,它是空的。将这些键/值添加到此对象的正确原因是什么?
答案 0 :(得分:1)
$http.get
是异步的,您的返回是同步的。您需要使用队列。 Angular内置了这个。
app.factory('simpleFactory', function ($http) {
...
var promises = [];
for (var i = 0; i < apiResource.length; i++) {
var key = apiResource[i].type;
var promise = $http.get('http://api.com/v1/path/' + key + '/' + apiResource[i].abbr + '/anotherpath?apikey=' + mykey).success(function (info) {
setDataKeyValues(key, info);
});
promises.push(promise);
}
// Once all asynchronous HTTP GET requests are complete
$q.all(promises).then(function () {
// Do something with the data, e.g.
$rootScope.apply();
});
return data;
});
simpleFactory
用词不当。工厂方法同步返回一个对象,然后在您注入的任何位置提供该对象。您在回调中设置的值将在稍后提供。
答案 1 :(得分:0)
由于请求是异步的,因此数据值仅在回调运行后设置,但您在任何回调有机会运行之前返回数据。
如果要在返回所有数据后执行某些操作,请在每次请求某些数据时递增计数器,并在设置数据后递减计数器。然后检查计数器是否为0,并运行依赖于数据的函数。