ngResource承诺揭示模块模式

时间:2014-10-14 12:01:34

标签: javascript angularjs promise

我试图理解Angular中的一些最佳实践,并希望在工厂中结合提到的模式以从REST API检索数据:

function feedFactory($resource) {
    var service = {
        feedData: [],
    };
    getFeedFromApi();

    return service;

    function getFeedFromApi() {
        var feed = $resource('http://footballdb.herokuapp.com/api/v1/event/de.2014_15/teams?callback=JSON_CALLBACK', {}, {
          query: {
            method: 'JSONP'
          }
        });

        feed.query().$promise.then(function(result) {
            service.feedData = result.toJSON();
        });
    }
}

不幸的是,我无法设置服务对象的feedData变量,尽管我收到了带有数据的有效promise对象。

1 个答案:

答案 0 :(得分:2)

deal with asynchronous requests的方式不正确。您返回时无法获得响应。所以undefined

通常角度的工厂看起来像这样:

function feedFactory($resource) {

    var service = {
        getFeedFromApi: getFeedFromApi
    };

    function getFeedFromApi() {

        var feed = $resource('http://footballdb.herokuapp.com/api/v1/event/de.2014_15/teams?callback=JSON_CALLBACK', {}, {
            query: {
                method: 'JSONP'
            }
        });

        return feed.query().$promise.then(function (result) {
            return result.toJSON(); // you really need to convert response to string?
        });
    }

    return service;
}

然后你以这种方式在控制器中使用它们:

feedFactory.getFeedFromApi().then(function(data) {
    // do something with data
});