2017-05-03 51 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塊。

相關問題