0

我正在努力使用 $cacheFactory,我正在尝试缓存一个简单的 GET 请求,然后从控制器中检索它 - 但我不明白我该怎么做。

这里是服务

        app.service('usersService', function ($http, $cacheFactory, $q) {

            var cache = $cacheFactory("todoList");
            this.getToDos = function() {
                var deferred = $q.defer();
                var req = {
                method: 'GET',
                url:'https://jsonplaceholder.typicode.com/todos',

                cache: true
                };

                var data = cache.get("todoList");
                if (!data) {
                $http(req).then(function(payload) {
                    deferred.resolve(payload.data);
                    cache.put("todoList", payload.data);
                }, function(reason) {
                    deferred.reject(reason);
                });
                } else {
                return data;
                }
                return deferred.promise;
            };

        })

这是控制器

        app.controller('usersListController', function ($scope, usersService, BookService,  $cacheFactory) {

            function init() {

                $scope.refresh();
                usersService.getToDos();
                var sharedCache = $cacheFactory.get('todoList'); // getting undefined
                console.log(sharedCache);
            }

            init();

        });

我猜问题是 GET 请求是异步的 - 所以当控制器执行 init 函数时 - GET 不会“得到”任何东西.....

4

2 回答 2

0

尝试更换这个

var sharedCache = $cacheFactory.get('todoList');

var cache = $cacheFactory('todoList'); 缓存.get();

注意 - 请参阅此链接https://docs.angularjs.org/api/ng/service/ $cacheFactory

语法 - $cacheFactory(Key); //获取数据

于 2020-05-22T14:51:53.330 回答
0

你的猜测是正确的,因为请求是异步的

var sharedCache = $cacheFactory.get('todoList');

正在运行,您的 todoList 可能已设置,也可能未设置。你能做的就是从你的服务中回报一个承诺。

this.getToDos = function() {
            var req = {
                method: 'GET',
                url:'https://jsonplaceholder.typicode.com/todos',
                cache: true
            };
            return req;
        }; 

并在控制器中解决您的承诺。

var promise = usersService.getToDos();
promise.then(function (recieved) {

},
function (error) {

});
于 2020-05-22T14:52:30.647 回答