2017-05-03 50 views
0

你好我无法弄清楚如何返回正确的功能/服务的一部分,因为它由于Yammer API paignating。角度服务“无法获取属性”,然后“未定义或空引用”

我已阅读文档,并尝试返回整个功能,但我花了这么长时间,我开始绝望,请帮助我。

的回报是在错误的地方,我想 - 我得到的错误:

"Unable to get property 'then' of undefined or null reference" 

我的控制器

app.controller("mainController", function($scope, $http, yammerREST) { 

    $scope.getYammerPosts = function() { 
       yammerREST.getYammerData($scope.yammerURL).then(function(data) { 
         $scope.results = data.results; 
       }); 
    }; 
}); 

我的服务

app.service("yammerREST", function($http) { 
    this.getYammerData = function(url) { 

     var groupID = url.split("feedId=")[1]; 
     console.log(groupID); 
     var baseURL = "https://www.yammer.com/api/v1/messages/in_group/" + groupID + ".json?threaded=true"; 
     var url = baseURL; 
     var results = []; 

     getPosts(); 

     function getPosts() { 
     return $http({ 
       url: url, 
       method: "GET", 
       headers: { "Accept": "application/json; odata=verbose" } 
      }).then(function(response) { 
        results = results.concat(response.data.messages); 
        console.log(results); 

        if (response.data.meta.older_available == true) { 
          url = baseURL + "&older_than=" + results[results.length-1].id; 
          getPosts(); 
        }; 

        return { 
         yammerListName: response.data.meta.feed_name, 
         results: results, 
        }; 
      }).catch(function(e){ 
       console.log("Error: ", e); 
      }); 
     }; 
    }; 
}); 
+1

如果我正确读取,我认为你的getYammerData方法,不会返回$ http诺言。它可能会错过一个关闭的支架。或'getPosts();'之前的返回? – Coldiary

+0

看来你返回getYammerData而不是返回承诺的$ http或getPost()方法。 – Knitesh

+0

'getPosts'函数被递归调用,但没有递归变量。要做有效的递归,'f(x)'必须调用'f(x + 1)'直到满足一些结束条件。 – georgeawg

回答

2

“Unable to get property 'then' of undefined or null reference”

该错误信息通常意味着该功能失败return承诺:

app.service("yammerREST", function($http) { 
    this.getYammerData = function(url) { 

     var groupID = url.split("feedId=")[1]; 
     console.log(groupID); 
     var baseURL = "https://www.yammer.com/api/v1/messages/in_group/" + groupID + ".json?threaded=true"; 
     var startURL = baseURL; 
     var results = []; 

     //vvvv RETURN promise 
     return getPosts(baseURL,startURL); 

     function getPosts (baseURL, url) { 
      //vvvv RETURN promise 
      return $http({ 
       url: url, 
       method: "GET", 
       headers: { "Accept": "application/json; odata=verbose" } 
      }).then(function(response) { 
        results = results.concat(response.data.messages); 
        console.log(results); 

        if (response.data.meta.older_available == true) { 
         var nextURL = baseURL + "&older_than=" + results[results.length-1].id; 
         //vvvv RETURN promise 
         return getPosts(baseURL,nextURL); 
        }; 

        return { 
         yammerListName: response.data.meta.feed_name, 
         results: results, 
        }; 
      }).catch(function(e){ 
       console.log("Error: ", e); 
       //IMPORTANT to re-throw error 
       throw e; 
      }); 
     }; 
    }; 
}); 

getPosts函数被递归调用。为了做有效的递归,f(x)必须调用f(x + 1)直到满足一些结束条件。

同样在.catch块它是re-throw errors重要的,以便跳过在承诺链中的后续.then块。

相关问题