在Angular中,当数据(此处为url)发生更改时,从控制器重新启动服务的方法



当我有了新的url时,让我的http请求再次运行并给出新结果的正确方法是什么?

我试图将整个http调用封装在另一个函数中,并从控制器中调用该函数。我还尝试再次运行fac.success。但什么都没用。谢谢你的指点。

app.factory('fac', ['$http', function(http) { 
    return http.get(url)
    .success(function(result) { 
        return result;})
    .error(function(err) { 
        return err; });
}]);

不能在successerror处理程序中返回数据。$http调用是异步的,因此在promise被解析时会调用回调函数。。。但是在服务运行后将数据返回到服务不会有任何效果。

相反,考虑将$http注入控制器并从那里调用它。

编辑

根据我的评论,$http本身就是一项服务,所以除非你做的不仅仅是打电话,否则将其封装在另一项服务中是没有意义的。只需在控制器中使用$http服务,如下所示:

angular.module('myApp')
    .controller('MyController', MyController);
MyController.$inject = ['$http'];
function MyController($http) {
    $http.get('http://path.to.api/')
        .then(function(res) { /* handle success */ })
        .catch(function(err) { /* handle error */ });
}

但是,如果您想提供一个进行调用并缓存响应的服务,您可以为此编写一个服务。像这样的。。。

angular.module('myApp')
    .factory('myDataService', myDataServiceFactory);
myDataServiceFactory.$inject = ['$http', '$cacheFactory', '$q'];
function myDataServiceFactory($http, $cacheFactory, $q) {
    var cache = $cacheFactory('myData');
    return {
        getData: getData,
    };
    function getData(url) {
        var data = cache.get(url);
        if (data) {
            var deferred = $q.defer();
            deferred.resolve(data);
            return deferred.promise;
        }
        var promise = $http.get(url);
        promise.then(function(res) {
            cache.put(url, res);
        });
        return promise;
    }
}

但是这个例子有点傻,因为$http已经提供了缓存响应数据的配置。

弃用通知

$http的遗留承诺方法.success.error已被弃用。请改用标准的.then方法1

app.factory('fac', ['$http', function(http) { 
    return (
        http.get(url).then( function onFulfilled (result) {
            //return data for chaining 
            return result.data;
        }).catch( function onRejected(response) {
            console.log(result.status);
            //throw to chain rejection  
            throw result;
        })
    );
}]);

最新更新