3

getstream API を angular サービス (factory) にラップしようとしています。

これが私のコードです:

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

まず、エンドポイント /api/feed/auth/ を使用して、サーバーから user_id と認証トークンを取得します。このデータは、Angular promise で返されます。

次に、このデータを使用して getstream API を呼び出し、user_feedオブジェクトを取得します。このオブジェクト ( user_feed) を返すと、コントローラーで未定義になります。ここでサービスのコンソールに出力すると、正しい値が表示されます。復帰後 0.5 秒ほどで印刷が行われることに気付きました。この変数の割り当てが非同期で行われるのはなぜですか?

getconsole.log ステートメント内でこのオブジェクトのメソッドを呼び出すとuser_feed、Javascript promise オブジェクトが出力されます。I の場合、コントローラーreturn user_feed.get()に戻ります。undefined上記のコードのようにサービスでここで呼び出し、promise then ステートメントでデータ オブジェクトを返すundefinedと、コントローラーに戻ります。ただし、dataオブジェクトを印刷すると、正しい値になります。

このサービスからオブジェクトを返せないのはなぜですか? promise を使用する基本的な側面が欠けていますか?

4

1 に答える 1

5

フィード プロミスが返さobjectdataておらず、feedメソッドから正しく返されていません。したがって、同じことを達成するには、 $http を介して .then を使用して、プロミス チェーンを維持します。

コード

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)
})
于 2016-03-30T21:30:29.433 に答える