【问题标题】:Angularjs - Cannot read property 'then' of undefined [duplicate]Angularjs - 无法读取未定义的属性“then”[重复]
【发布时间】:2018-02-04 23:15:50
【问题描述】:

我是 angularjs 新手,我知道有很多关于这个错误的问题, 不幸的是,我在其中任何一个问题中都找不到适合我的问题的答案。

我有一个拥有所有功能的工厂,以及使用它们的控制器。在一个控制器中,我得到了一个返回数组的 GET 函数,我的大多数函数都写得几乎相同,以及与这个完全相同的函数,只是变量名称/url不同,但这个错误只发生在这个函数:

控制器:

$scope.getAllFunction = function(){
         appServicesProvider.getAll($scope.var1).then(function(res){
             $scope.var2 = res;
         })
     };

工厂(appServicesProvider):

   function getAll(var1){
            $http.get(restURL+var1).then(
                    function(response){
                        return [].concat(response.data.var2)
                    }
            );
        }

正如我所说,还有更多的函数写的完全一样,只有这个不起作用,这让我更难解决。 感谢您提供的任何帮助!

【问题讨论】:

  • 你还没有兑现承诺
  • @harishr 你能说得具体一点吗?
  • 你必须返回你的 $http 调用,比如 return $http.get(restURL+var1).then( function(response){ return [].concat(response.data.var2) } ); .但大多数工厂应该返回一个对象。
  • @Vivz 耶稣你是对的。我的错。删除问题!谢谢! :)

标签: angularjs angular-promise angularjs-http


【解决方案1】:

你必须兑现承诺

  function getAll(var1){
           return $http.get(restURL+var1).then(
                    function(response){
                        return [].concat(response.data.var2)
                    }
            );
        }


或者您可以使用$q 重写您的工厂以返回包含已解决承诺的对象
app.factory('appServicesProvider', function() {
    return {
        getAll: function(var1) {
            var defer = $q.defer();
            $http.get(restURL + var1).then(function(response) {
                defer.resolve([].concat(response.data.var2));
            }).catch(function(response, status) {
                defer.reject(response.data.message);
            });
            return defer.promise;;
        }
    }
});

【讨论】:

  • 谢谢,但我更喜欢保持简单 :) 你的第一个答案是对的哈哈,谢谢!
  • 我知道它适用于第一种方法。但我更喜欢第二种方法而不是第一种方法。 :)
  • 第二个答案是defer anti-patten,应该避免。这是不必要的,而且容易出错。
  • @georgeawg 谢谢。我不知道。 :)
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2016-06-18
  • 1970-01-01
  • 2017-12-15
  • 2015-03-28
相关资源
最近更新 更多