【问题标题】:Objects returned from promise are undefined从 promise 返回的对象是未定义的
【发布时间】:2016-07-19 02:53:46
【问题描述】:

我正在尝试将 getstream API 包装在 Angular 服务(工厂)中

这是我的代码:

.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 和 auth 令牌。此数据以 Angular Promise 的形式返回。

接下来,我使用这些数据调用getstream api 来获取user_feed 对象。如果我返回这个对象 (user_feed),它在控制器中是未定义的。如果我将它打印到服务中的控制台,它具有正确的值。我注意到打印发生在返回后半秒左右。 为什么这个变量的赋值是异步发生的?

现在,如果我在 console.log 语句中对该 user_feed 对象调用 get 方法,则会打印出一个 Javascript 承诺对象。如果我 return user_feed.get() 它返回 undefined 给控制器。如果我像上面的代码一样在服务中调用它,并在 promise then 语句中返回数据对象,它会将 undefined 返回给控制器。但是,如果我打印 data 对象,它的值是正确的。

为什么我不能从该服务返回任何对象?我是否遗漏了使用 Promise 的一些基本方面?

【问题讨论】:

  • 你的函数实际上都没有return 任何东西,你不能使用success 代替then

标签: javascript angularjs promise angular-promise getstream-io


【解决方案1】:

您尚未返回提要承诺 object 以及 data 尚未从 feed 方法正确返回。因此,为了实现同样的目的,请使用 .then over $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)
})

【讨论】:

  • 谢谢。这有助于我更好地理解承诺。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2019-11-03
  • 1970-01-01
  • 2019-03-28
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多