第一次尝试使用angularjs并尝试使用promise模式 -
我有一个服务实用程序,我有这个方法 -
this.getData= function(url){
var defer = $q.defer();
$http({method: 'GET', url: url}).
success(function(data, status){
defer.resolve(data);
})
.error(function(data, status) {
defer.reject(status);
});
return defer.promise;
};
现在在我的控制器中,我正在调用一个名为A()的方法
var A = function () {
$scope.myobjectArray = [];
return utility.getData("some url").then(funciton(data)
{
for (i = 0; i < data.length; i++) {
$scope.myobjectArray.push(data[i].attribute1, new Array());
}
}
).
then(function () {
return getTheSecondAttributeArray();
}).catch(function (status) {
//display error
});
};
var getTheSecondAttributeArray = function () {
for (i = 0; i < $scope.myObjectArray.length; i++) {
var secondAttributeArray = [];
var currentType = $scope.myObjectArray[i];
utility.getData("some url").then(function (response) {
for (j = 0; j < response.length; j++) {
//some response manipulation
secondAttributeArray.push(response[j].text);
}
currentType.secondAttribute = secondAttributeArray;
}).catch(function () {//catch error, display message
})
}
}
但是,看起来$ scope.myobjectArray(第n-1个元素)的最后一个元素只是被填充了。此外,最后一个元素包含的secondAttributeArray是$ scope.myobjectArray的所有对象的所有secondAttributes的连接数组。
无法弄清楚我可以在这里改变什么。
编辑:
当我尝试在'then'函数中访问$ scope.myObjectArray [j]时,它表示$ scope.myObjectArray [j]未定义。 - &GT;所以我创建了一个currentType变量并为其分配了$ scope.myObjectArray [j],并且可以在'then'函数中轻松访问。怪异!
另外,我看到只有$ scope.myObjectArray的最后一个对象获取值而不是其余的。数组中的其余对象是空的
感谢任何帮助。
var myObject = function(firstattribute, secondAttribute){
this.firstattribute = firstattribute;
this.secondAttribute = secondAttribute;
}
Beehive(Angularjs $q.all)的解释是我所面对的。我只得到最后一个循环的数据。
答案 0 :(得分:1)
问题在于功能关闭。当get数据返回时,你的currentType是最后一个,因为for j循环已经结束了。所以你需要做的是将代码从utility.getData
移动到一个单独的方法,传递currentType
和seccondAttributeArray
的参数,以便闭包将它们作为函数的参数包含在内不要随着j循环的进展而改变它们。
for (i = 0; i < $scope.myObjectArray.length; i++) {
var secondAttributeArray = [];
var currentType = $scope.myObjectArray[i];
fillSecondAttributeArray($scope, secondAttributeArray, currentType);
}