Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS回调,复制$http的行为。把缓存变成承诺_Javascript_Angularjs_Caching_Callback_Angular Promise - Fatal编程技术网

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

Javascript AngularJS回调,复制$http的行为。把缓存变成承诺,javascript,angularjs,caching,callback,angular-promise,Javascript,Angularjs,Caching,Callback,Angular Promise,我想为我的http请求创建一个缓存,所以我想复制$http回调 这是我的职责: function getData() { if(cacheExists()) { return cache; } return $http({ method: 'POST', url: 'http://something.com', params: {something} }); } 我

我想为我的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方法完美配合,
但不会与我的“缓存”一起工作,因为“缓存”应该有这些回调:成功与错误,我如何创建它们?

这是因为$http返回一个承诺。您可以通过使用$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;
} 
所以这里发生了什么,你创造了“不同的”作为承诺。承诺基本上是处理异步任务的一种方式。当您得到一个承诺时,您需要解决它,就像您在http调用返回值时所做的那样。但是如果使用$q,则使用“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");
}

这是因为$http返回一个承诺。您可以通过使用$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;
} 
所以这里发生了什么,你创造了“不同的”作为承诺。承诺基本上是处理异步任务的一种方式。当您得到一个承诺时,您需要解决它,就像您在http调用返回值时所做的那样。但是如果使用$q,则使用“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");
}

对不起。。。什么是$q,我该如何注入他呢?嗯,您将如何处理http错误可能取决于我猜的用例。在控制器和/或服务中,在注入$http的位置注入$q。您曾经在哪里实现过getData函数。当然,这取决于具体情况,但我的意思是,现在我只有“.then”回调,所以我不知道这是错误还是成功…您可以传入两个回调。一个successcallback和一个errorcallback。让我更新一下这个例子。我会尝试深入了解它,希望我能理解,谢谢你的帮助!对不起。。。什么是$q,我该如何注入他呢?嗯,您将如何处理http错误可能取决于我猜的用例。在控制器和/或服务中,在注入$http的位置注入$q。您曾经在哪里实现过getData函数。当然,这取决于具体情况,但我的意思是,现在我只有“.then”回调,所以我不知道这是错误还是成功…您可以传入两个回调。一个successcallback和一个errorcallback。让我更新一下这个例子。我会尝试深入了解它,希望我能理解,谢谢你的帮助!