如何在angularjs的循环中调用第二个顺序promise设计模式方法?

时间:2016-03-16 15:03:15

标签: javascript angularjs promise angular-promise

第一次尝试使用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)的解释是我所面对的。我只得到最后一个循环的数据。

1 个答案:

答案 0 :(得分:1)

问题在于功能关闭。当get数据返回时,你的currentType是最后一个,因为for j循环已经结束了。所以你需要做的是将代码从utility.getData移动到一个单独的方法,传递currentTypeseccondAttributeArray的参数,以便闭包将它们作为函数的参数包含在内不要随着j循环的进展而改变它们。

for (i = 0; i < $scope.myObjectArray.length; i++) { 
  var secondAttributeArray = []; 
  var currentType = $scope.myObjectArray[i];
  fillSecondAttributeArray($scope, secondAttributeArray, currentType);
 }