在我的服务,我厂查找了大量的数据集 - 我要坚持它,并检查其存在,以避免再次调用它(In my se

2019-09-26 13:28发布

我的服务(工厂)进行API调用和响应数据分配给一个变量:

    .factory('MedicationMatchingNamesFactory', 
                ['$http', '$q', 'MedicationDisplayNamesFactory', 
                    function MedicationMatchingNamesFactory($http, $q, MedicationDisplayNamesFactory){

        return {
            getMatchingNames: function(inputValue){

                var matches = [];

                // I thought this may be set as null so I'm able to 
                // differentiate it from the below array form (when exists)
                var allNames = null;

                    MedicationDisplayNamesFactory.getDisplayNames().then(
                            function(response){

                                // this is the large dataset - now as array
                                var allNames = response.data.displayTermsList.term;

                                angular.forEach(allNames, function(value, key){

                                    if(value.indexOf( inputValue ) !== -1){
                                        matches.push(value);
                                    }

                                });
                            }
                        );


                return matches;
            }
        };
        return MedicationMatchingNamesFactory;
    }])

我采用了棱角分明的用户界面的“用户界面,选择”指令,根据输入的字符串这个大数据集内进行搜索。

在我的控制器:

        $scope.$on('inputStarted', function(event, value){
            if(value.length > 3){
                $scope.meds.displayNames = MedicationMatchingNamesFactory.getMatchingNames(value);
                console.log($scope.meds.displayNames);
            }
        });

现在,为了避免查询API(实际上是调用包含调用API另一个服务)每输入字符数大于3的时候,我认为这将是巨大的,如果我能够检查是否allNamesnull (空,做电API),或者它是一个array (跳过调用,只需使用)。

我试着移动angular.forEach外呼的一部分,承诺不过呢,很明显,什么都不会发生,因为它不是在第一次运行尚未解决。

有没有一种方法能有这个allNames数据集我做的API调用检查?

Answer 1:

您可以移动的声明allNames服务的return语句之外,然后检查它是否是null查询API之前。 这样allNames用作内部API调用的结果高速缓存。

另外请注意,它会更好,如果返回从一个承诺getMatchingNames ,否则你的服务总是返回一个空数组向右走,然后把它填满后,内部API调用完成后。 如果你返回一个承诺,你就需要改变你的设置方式displayNamesinputStarted事件处理程序:

    MedicationMatchingNamesFactory.getMatchingNames.then(function(matches) {
      $scope.meds.displayNames = matches;
    });

和你的服务看起来是这样的:

    .factory('MedicationMatchingNamesFactory',
      ['$http', '$q', 'MedicationDisplayNamesFactory', 
        function MedicationMatchingNamesFactory($http, $q, MedicationDisplayNamesFactory) {

          var allNames = null;

          function getMatches(inputValue, list){
            var matches = [];
            angular.forEach(list, function(value, key){
              if(value.indexOf(inputValue) !== -1){
                matches.push(value);
              }
            });
            return matches;
          }

          return {
            getMatchingNames: function(inputValue){
              var deferred = $q.defer();

              if (allNames !== null) {
                deferred.resolve(getMatches(inputValue, allNames));
              } else {
                MedicationDisplayNamesFactory.getDisplayNames().then(
                  function(response){
                    // this is the large dataset - now as array
                    allNames = response.data.displayTermsList.term;
                    deferred.resolve(getMatches(inputValue, allNames));
                  },
                  function(reason){
                    deferred.reject(reason);
                  }
                );
              }
              return deferred.promise;
            }
          };
        }])


Answer 2:

其实解决这个问题很简单:我只是与去sessionStorage这似乎完全适合我的需要,在这种情况下,我需要大数据集的坚持只是本次会议,如果它失去了对下一个没关系。 我们的目标是防止取一次以上,也就是超过必要的,因为里面的值是不太可能,会议期间将要改变。



文章来源: In my service-factory I lookup up a large dataset - I want to persist it and check for its existence to avoid calling it again