如何从工厂获得具体结果?

时间:2015-09-13 01:21:54

标签: javascript angularjs angularjs-factory

我正在学习angularjs,而且我正在努力从这家工厂获得我想要的结果:

create_logger

2 个答案:

答案 0 :(得分:0)

app.factory('foreCast', ['$q', '$http', function ($q, $http) {
    return {
        getRand: function () {
            var deferred = $q.defer();

            $http
                .jsonp("https://www.kimonolabs.com/api/c1ab8xnw?&apikey=api-key&callback=JSON_CALLBACK")
                .then(function (response) {
                    var rows = response.data.results.collection1;
                    var rand = rows[Math.floor(Math.random() * rows.length)];
                    deferred.resolve(rand);
                }, function (err) {
                    deferred.reject(err);
                })
                return deferred.promise;
            }
        }
}])

然后从控制器例如使用它:

foreCast.getRand().then(function(rand){
    var myRand = rand;
})

答案 1 :(得分:0)

首先,您永远不想将成功处理程序与http一起使用。我相信它实际上已被弃用了。最佳做法是使用.then和.catch进行错误。其次,大部分时间你应该在控制器中处理结果,因为服务不应该知道如何处理数据。

所以说,我们可以稍微减少你的工厂。

app.factory('foreCast', ['$http', function($http,$scope ) { 
    var factory = {};
    factory.rand = function() {
        return $http.jsonp("https://www.kimonolabs.com/api/c1ab8xnw?&apikey=api-key&callback=JSON_CALLBACK");
    };

    return factory;
}]);

现在在您的控制器中:

app.controller('controller', ['foreCast', function(foreCast) {
    var self = this;

    foreCast.rand().then(function(response) {
        var rows = response.results.collection1;
        self.rand = rows[Math.floor(Math.random() * rows.length)];
    });
}]);

现在在您的视图中,只需使用rand访问此值。

<div ng-bind="ctrl.rand"></div>