【问题标题】:Callback is not a function, angularJS回调不是函数,angularJS
【发布时间】:2015-08-07 14:56:19
【问题描述】:
getStuff: function(stuff, callback) {

            $http({
                method: 'GET',
                url: url + "/" + stuff
                cache: true
            }).success(function(data) {
                console.log(data);
                callback(data);
            });

        },

我有上面的代码。我在整个应用程序中多次使用它,但是当我调用它时,我得到的回调不是一个函数。控制台日志(数据);然而,返回适当的对象。有人知道为什么吗?

谢谢

【问题讨论】:

  • 你能告诉我们getStuff的电话
  • 是不是你必须将回调传递给子函数.success?到回调被调用时,它没有任何耦合。
  • 回调是getStuff 的一个参数,因此您似乎没有将函数传递给该参数
  • 消息说明了一切:您将一些不是函数的东西(或者您没有传递任何回调)传递给getStuff()。无论如何,这不是使用 Promise 的好方法。您不应该将回调传递给 getStuf()。相反,getStuff() 应该返回 promise,调用者应该在返回的 promise 上调用 then() 或 success()。阅读blog.ninja-squad.com/2015/05/28/angularjs-promises

标签: angularjs http callback get


【解决方案1】:

查看调用 getStuff(stuff, callback) 的行。我的猜测是第二个“回调”参数实际上不是一个函数。在与令人沮丧的错误作斗争多年后,我了解到,当有疑问时,错误信息是 100% 准确的。

【讨论】:

    【解决方案2】:

    确保getStuff 函数的第二个参数是function。但是,您应该使用 promise 来处理 $http 请求。根据定义,$http 返回承诺,并使用 $q.defer() 承诺管理器。使用 promise 和 $q 是一种很好的做法。

    服务

    (function(){
    
      function Service($http, $q){
    
        function get(){
          //Use $q.defer() promise manager
          var defer = $q.defer();
          //Create a defer promise
          var promise = defer.promise;
    
          $http.get('path_to_url').then(function(response){
            //resolve our data
            defer.resolve(response.data);
          });
    
          //return the promise
          return promise;
    
        }
    
        var factory = {
          get: get
        };
    
        return factory;
    
      }
    
      angular
        .module('app')
        .factory('Service', Service);
    
    })();
    

    控制器

    (function(){
    
    function Controller($scope, Service, $q) {
    
      Service.get().then(function(data){
    
        //Here your resolve data
        console.log(data);
      })
    
    }
    
    angular
    .module('app', [])
    .controller('ctrl', Controller);
    
    })();
    

    【讨论】:

    • 你的promise代码是一个反模式:返回的promise永远不会被拒绝,即使http调用失败,而且它太复杂了。您可以简单地将其替换为return $http.get('...').then(function(response) {return response.data;});。阅读blog.ninja-squad.com/2015/05/28/angularjs-promises
    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多