在Angular中模拟异步操作

时间:2014-03-29 09:13:22

标签: javascript angularjs

我有以下场景:我正在加载和缓存一些数据以避免相同信息的http请求,但我不确定我是否正确地执行了此操作:

在服务中:

this.get = function(id){
    var that = this,
    promise;

    if(that.loadedData){
        // resolve it right away if data is present
        promise = $q.defer();
        promise.resolve(that.loadedData);
        promise = promise.promise;
    }else{
        promise = $http.get('/get/'+id).then(function(response){
            that.loadedData = response;
        });
    }

    return promise
};

在控制器中:

someService.get().then(function(){
    $scope.data = someService.loadedData;
});

特别是我手动创建承诺并立即解决它的部分“感觉不对”,但这是我找到的唯一方法。是否有一些处理这种情况的模式?

3 个答案:

答案 0 :(得分:3)

立即解决问题不是问题,但我认为从承诺中回归是更好的做法:

this.get = function(id){
    var that = this;
    var deferred = $q.defer();

    if(that.loadedData){
        // resolve it right away if data is present
        deferred.resolve(that.loadedData);
    }else{
        $http.get('/get/'+id).then(function(response){
            that.loadedData = response;
            deferred.resolve(response);
        });
    }
    return deferred.promise;
};

使用promise的意义是在异步函数中使用它,在这种情况下是$ http.get()。你会在很多角度教程中看到很多这种模式。

答案 1 :(得分:2)

你在做什么似乎是一项大量的手工工作。我建议使用Restangular:

https://github.com/mgonto/restangular#can-i-cache-requests

但你也可以用纯角度达到同样的效果。看看:

http://docs.angularjs.org/api/ng/service/$cacheFactory

在大多数情况下,我建议在尝试自己解决问题之前使用并尝试查找现有解决方案。话虽如此,除了代码看起来很难吃之外,我也认为你的方法没有错。

答案 2 :(得分:1)

是的,有一个。
$http中的AngularJS有自己的缓存实现。只需在其选项中将cache设置为 true
然后首先检查缓存中的数据,如果没有 - 请问后端。

this.get = function (id) {
    var cache = $cacheFactory('myCache'),
    that = this;
    this.loadedData = cache.get();

    if( !this.loadedData ) {
       return $http.get('/get/'+id, {cache: true}).then(function(response){
           that.loadedData = response;
       });
    }

    return $q.when( this.loadedData );
};

您还需要从此方法返回一个承诺。这就是我们将$q.when( this.loadedData )$http包裹起来的原因 Docs cacheFactory