Javascript AngularJS回调,复制$http的行为。把缓存变成承诺
我想为我的http请求创建一个缓存,所以我想复制$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} }); } 我
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。让我更新一下这个例子。我会尝试深入了解它,希望我能理解,谢谢你的帮助!