AngularJS。但未定义

时间:2016-02-10 19:55:47

标签: angularjs http-post angular-promise

我有一个我发布到API的有效负载。我正在调用从我的控制器调用API的方法:

 arisService.getVarStatData(
                JSON.stringify($scope.payload),
                JSON.stringify($scope.config.index_info),
                field,
                stat
                )
                .then(function (data) {

                    $scope.varStat = data;

                    console.log("var stat data", $scope.varStat);
                });

在我的服务中,由于FIELD是一个数组,我有一个for循环将数组的值推送到有效负载,然后调用一个以有效负载作为参数的函数:

 function getVarStatData(payload, index, field, stat) {

        for (var i = 0; i < field.length; i++) {
            if (field[i]) {

                var varStatData = {
                    user_selection: payload,
                    index_info: index,
                    field: field[i],
                    statistic: stat

                };

                postStatData(varStatData);

            }
        }
    }

    function postStatData(varStatData){
        var deferred = $q.defer();

        $http({
            url: 'API',
            method: "POST",
            data: $.param(varStatData),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).then(function (response) {
            var varStat = response.data;

            console.log("variable stat response data", varStat);

            deferred.resolve(varStat);
        });

        return deferred.promise;

    }

现在我能够完美地获取我的服务中的数据但是在我的控制器中我得到一个错误“无法读取未定义的.then的属性。最初我没有使用$ q解析承诺所以我做了它并认为这将完成工作,但没有运气。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

问题是未从getVarStatData方法返回promise对象,因此您需要从postStatData方法返回getVarStatData函数。

function getVarStatData(payload, index, field, stat) {
   var result = [], promise;
   for (var i = 0; i < field.length; i++) {
     if (field[i]) {
       var varStatData = {
         user_selection: payload,
         index_info: index,
         field: field[i],
         statistic: stat

       };
       promises.push(postStatData(result));
     }
   }
   //this will call the data method once all postStatData is accomplished
   return $q.all(promises);
 }

答案 1 :(得分:1)

如果您想在多次异步函数调用后执行某些操作,可以使用.all()

function getVarStatData(payload, index, field, stat) {
    var promises = [];
    for (var i = 0; i < field.length; i++) {
        if (field[i]) {

            var varStatData = {
                user_selection: payload,
                index_info: index,
                field: field[i],
                statistic: stat

            };

            promises.push(postStatData(varStatData));

        }
    }
    return $q.all(promises);
}

all承诺通过一系列解决方案得到解决。 请参阅此页面上的文档 - https://docs.angularjs.org/api/ng/service/ $ q