Javascript 使用带缓存的angular$AsyncValidator

Javascript 使用带缓存的angular$AsyncValidator,javascript,html,css,angularjs,Javascript,Html,Css,Angularjs,我有一个验证指令,它根据端点检查一个值 App.directive('validate', function(fooService, $q) { return { restrict: "A", require: "ngModel", link: function(scope, elem, attrs, ngModel) { ngModel.$asyncValidators.async = function(modelValue, viewValue) {

我有一个验证指令,它根据端点检查一个值

App.directive('validate', function(fooService, $q) {
  return {
    restrict: "A",
    require: "ngModel",
    link: function(scope, elem, attrs, ngModel) {
      ngModel.$asyncValidators.async = function(modelValue, viewValue) {
        return fooService.get(viewValue)
        .then(function(resp) {
          if (!resp.data.success) {
            return $q.reject('Not found');
          } else {
            return true;
          }
        });
      };
    }
  };
});

有没有一种方法可以缓存该调用以前的结果,并在执行AJAX调用之前对照这些结果进行检查?

当然,可以将结果保存在某种变量中,如下所示:

App.directive('validate', function(fooService, $q) {

    var previousResults = {};

    return {
        restrict: "A",
        require: "ngModel",
        link: link
    };

    function link(scope, elem, attrs, ngModel) {
        ngModel.$asyncValidators.async = validateAsync;

        function validateAsync(modelValue, viewValue) {
            var previousResult = previousResults[viewValue];

            if(angular.isDefined(previousResult){
                var method = (previousResult === true) ? 'resolve' : 'reject';
                return $q[method](previousResult);
            }else{
                return fooService.get(viewValue)
                    .then(onSuccess)
                    .catch(onError);
            }

            function onSuccess(resp){
                return previousResults[viewValue] = !!resp.data.success;
            }

            function onError(){
                return previousResults[viewValue] = false;
            }
        }
    }
});

请注意,在AngularJS<1.4中,$q.resolve被称为$q.when。

到底是什么阻止您缓存结果?是您的代码完成了AJAX