2016-03-30 10 views
3

Ich versuche, die getstream API in einem Winkel Service (Fabrik) zu wickelnObjekte zurückgegeben von Versprechen sind nicht definiert

Hier ist mein Code:

.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; 
       }) 
      }) 
     }, 
    } 

Zuerst habe ich die user_id und Auth-Token erhalten von meinem Server über den Endpunkt/api/feed/auth /. Diese Daten werden in einem Winkelversprechen zurückgegeben.

Als nächstes benutze ich diese Daten, um die getstream API aufzurufen, um das Objekt user_feed zu erhalten. Wenn ich dieses Objekt zurücksende (user_feed), ist es in der Steuerung nicht definiert. Wenn ich es hier im Service auf der Konsole ausdrucke, hat es den richtigen Wert. Ich habe bemerkt, dass der Druck nach der Rückkehr eine halbe Sekunde dauert. Warum erfolgt die Zuweisung dieser Variablen asynchron?

Jetzt, wenn ich die get Methode auf diesem user_feed Objekt innerhalb einer console.log Anweisung aufrufen, ein Javascript Versprechen Objekt ausgedruckt wird. Wenn ich return user_feed.get() es undefined an die Steuerung zurückgibt. Wenn ich es hier im Service wie in meinem obigen Code anrufe und das Datenobjekt in der Promise-Than-Anweisung zurückgebe, gibt es undefined an den Controller zurück. Wenn ich jedoch das data Objekt drucke, hat es den richtigen Wert.

Warum kann ich keine Objekte von diesem Service zurückgeben? Fehle mir ein grundlegender Aspekt der Verwendung von Versprechen?

+2

Keine Ihrer Funktionen 'tatsächlich return' etwas zu halten Chaining, und Sie dürfen nicht "Erfolg" statt "dann" verwenden. – Bergi

Antwort

5

Sie haben das Feed-Versprechen object und data nicht zurückgegeben. Die Methode feed wurde nicht ordnungsgemäß zurückgegeben. Also für die gleiche Sache zu erreichen http verwenden .then über $ Versprechen

-Code

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; 
      }) 
     }) 
    }, 
} 

-Controller

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

Danke. Dies hat mir geholfen, Versprechungen besser zu verstehen. – rawbeans