2016-03-30 145 views
3

我試圖包裹getstream API中的角服務(廠)對象從承諾返回未定義

這裏是我的代碼:

.factory('FeedStream', function($http, $q) { 

    var client = stream.connect('xxxxxxxxxxx'); 

    return { 
     feed : function() { 
      $http.get('/api/feed/auth/') 
      .success(function(auth) { 

       var user_feed = client.feed('user', auth.user, auth.token); 
       console.log(user_feed.get()); 

       user_feed.get().then(function(data) { 
        console.log(data); 
        return data; 
       }) 
      }) 
     }, 
    } 

首先我從USER_ID和身份驗證令牌我服務器使用endpoint/api/feed/auth /。這些數據是以角度承諾返回的。

接下來,我使用此數據調用getstream api來獲取user_feed對象。如果我返回這個對象(user_feed),它在控制器中是未定義的。如果我將它打印到服務中的控制檯,它具有正確的值。我注意到,印刷後發生了半秒左右的事情。 爲什麼這個變量的賦值異步發生?

現在,如果我在調用console.log語句的user_feed對象上調用get方法,則會打印出Javascript承諾對象。如果我return user_feed.get()它將undefined返回給控制器。如果我在上面的代碼中的服務中調用它,然後返回promise then語句中的數據對象,它會將undefined返回給控制器。但是,如果我打印data對象,它具有正確的值。

爲什麼我無法從此服務中返回任何對象?我錯過了使用promise的一些基本方面嗎?

+2

沒有你的函數實際上'return'什麼,你不能使用'success'而不是'then'。 – Bergi

回答

5

您還沒有退換貨承諾object以及data尚未從feed方法正確返回。因此,爲實現同樣的事情不要使用。後來在$ HTTP保持承諾鏈接

代碼

return { 
    feed : function() { 
     //return `$http.get` promise 
     return $http.get('/api/feed/auth/') 
     .then(function(response) { 
      var auth = response.data; 
      var user_feed = client.feed('user', auth.user, auth.token); 
      console.log(user_feed.get()); 
      //return `$http.get` to return internal promise 
      return user_feed.get().then(function(data) { 
       console.log(data); 
       return data; 
      }) 
     }) 
    }, 
} 

控制器

FeedStream.feed().then(function(data){ 
    console.log("data returned by user feed", data) 
}) 
+1

謝謝。這有助於我更好地理解承諾。 – rawbeans