AngularJS多次处理调用承诺
AngularJS handle calling promise multiple times
我有一个服务,必须返回给我的国家/地区列表。但是我想将国家/地区值缓存到变量中以防止多个 ajax 调用。我创建了一个承诺对象,但我的 html 必须多次调用此服务。当我调用服务时,有时它会在从缓存返回后第一次从 ajax 返回,有时它会在该缓存后从 ajax 重新运行 3 次。我该如何处理?
这是我的服务:
var vm = this;
vm.countries;
vm.getCountries = function () {
var q = $q.defer();
if (vm.countries === undefined) {
return $http({
method: 'POST',
cache: true,
url: API + '/api/Global/Countries',
}).then(function successCallback(response) {
if (errorHandler(response.data)) {
vm.countries = response.data;
q.resolve(response.data)
console.log("ajax")
return q.promise;
}
});
} else {
console.log("cache")
q.resolve(vm.countries)
return q.promise;
}
}
在所有情况下返回 q.promise
vm.getCountries = function () {
var q = $q.defer();
if (vm.countries === undefined) {
return $http({
method: 'POST',
cache: true,
url: API + '/api/Global/Countries',
}).then(function successCallback(response) {
if (errorHandler(response.data)) {
vm.countries = response.data;
q.resolve(response.data)
console.log("ajax")
}
});
} else {
console.log("cache")
q.resolve(vm.countries)
}
return q.promise;
}
您可以缓存承诺而不是数据。您可能还需要考虑此处的错误情况下会发生什么。需要清除缓存的承诺。
var vm = this;
function getCountries () {
if (!vm.countryPromise) {
vm.countryPromise = $http({
method: 'POST',
cache: true,
url: API + '/api/Global/Countries',
}).then(function successCallback(response) {
if (errorHandler(response.data)) {
console.log("ajax")
return response.data;
}
});
} else {
console.log("cache")
}
return vm.countryPromise;
}
如果您使用它来将值绑定到模板。我认为,也可以使用$resource
来实现。
angular.module('myApp').factory('Country', function($resource) {
return $resource(API + '/api/Global/Countries');
});
//in controller
var countries= Country.query(function() {
console.log(countries);
});
引用自资源文档
重要的是要认识到,调用$resource对象方法会立即返回一个空引用(对象或数组,具体取决于 isArray)。从服务器返回数据后,将使用实际数据填充现有引用。这是一个有用的技巧,因为通常资源被分配给一个模型,然后由视图呈现。如果对象为空,则不会呈现,一旦数据从服务器到达,该对象就会填充数据,视图会自动重新呈现自身,显示新数据。这意味着在大多数情况下,永远不必为操作方法编写回调函数。
https://docs.angularjs.org/api/ngResource/service/$resource
https://www.sitepoint.com/creating-crud-app-minutes-angulars-resource/
相关文章:
- 等待循环调用的所有承诺完成
- AngularJS因果报应测试规范承诺未解析,且未调用.then()
- 谷歌日历 api 调用可以在角度工厂内返回承诺吗?
- JavaScript - 返回承诺和/或调用回调
- 如何在使用替代承诺时解释 ajax 调用中的错误
- 递归承诺调用 - 内存范围变量问题
- “未捕获(在承诺中)”在获取“then”方法中调用拒绝函数时
- 使用 Promise 在另一个函数中调用带有 Bluebird 承诺库的函数
- javascript承诺在循环中或如何逐个调用函数
- 按照承诺,通过与chai的函数调用验证已解析承诺的内容
- 基于DOM插入承诺对API调用进行限制
- 在 Mocha 中,返回将被拒绝的承诺与调用 done(err) 的效果不同
- 进行多个 http 调用并使用承诺合并结果
- 如何在第一次调用后重新调用承诺
- Javascript 承诺 .catch 仍然调用 final variable.then
- 如何递归调用承诺函数
- 测试使用摩卡在其中调用承诺的函数
- 如何在承诺链中调用承诺通知
- jQuery递归AJAX调用承诺
- AngularJS多次处理调用承诺