AngularJS回调,复制$ http的行为。将缓存变为承诺

时间:2014-10-18 14:02:51

标签: javascript angularjs caching callback angular-promise

我想为我的http请求创建一个缓存,所以我想复制$ http回调。

这是我的功能:

function getData() {
    if(cacheExists()) {
        return cache;
    }

    return $http({
            method: 'POST',
            url: 'http://something.com',
            params: {something}
        });
}

这就是我处理它的方式:

  getData()
        .success(function(data) {
            $scope.spot = data.data;
            console.log($scope.spot);
        }).error(function(data) {
            console.log('error');
        });

这将与angularjs $ http方法完美配合, 但是不能用我的“缓存”,因为“缓存”应该有那些回调:成功&错误,我该如何创建它们?

1 个答案:

答案 0 :(得分:4)

因为$ http返回一个promise。您可以使用$ q服务解决此问题,并将缓存作为承诺返回。

//inject $q
function getData() {
   var deffered = $q.defer()
   if(cacheExists()) {
      deffered.resolve(cache);
   } else {
       $http({
            method: 'POST',
            url: 'http://something.com',
            params: {something}
       })
      .success(function(data) {
         deffered.resolve(data);
       })
      .error(function(response) {
        deffered.reject(response);
      })
   }

    return deffered.promise;
} 

所以这里发生了什么,你正在创造“deffered”作为承诺。 Promise基本上是一种处理异步任务的方法。当你得到一个承诺,你需要解决它,就像你从http调用返回值。但是,如果使用$ q deffered,则使用'then'而不是'success'。请考虑以下代码段:

getData()
    .then(function(data) {
        $scope.spot = data.data;
        console.log($scope.spot);
    })

希望这有帮助。

<强>更新 例如,通过处理错误,你可以这样做:

getData()
    .then(function(data) {
        if(data.data) {
            $scope.spot = data.data;
            console.log($scope.spot);
        } else {
            console.log("its an err");
        }
    });

或者这个

getData()
    .then(successCallback, errorCallback);

function successCallback(data) {
    $scope.spot = data.data;
    console.log($scope.spot);
}

function errorCallback() {
  console.log("its an err");
}