AngularJS .then 的未定义

AngularJS .then of undefined

我有一个要发布到 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;

    }

现在我能够在我的服务中完美地获取数据,但在我的控制器中我得到一个错误“无法读取 属性 of .then of undefined。最初我没有使用 $ 解决承诺q 所以我做了它并认为可以完成工作但运气不好。感谢任何帮助!

问题是 promise 对象没有从 getVarStatData 方法得到 returned,所以你需要 return 来自 getVarStatDatapostStatData 函数方法。

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);
 }

如果你想在多个异步函数调用后做某事,你可以使用.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