2016-03-30 146 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