Вызов $ http внутри часов angularjs из директивы - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь вызвать службу $ http изнутри часов в моей директиве.Предполагается, что директива помещается в более чем один элемент ввода.Если значение всех элементов изменяется вместе, часы запускаются спина к спине, и $ http также вызывается спина к спине, иногда путая ответ на каждый вызов $ http, то есть для последовательных вызовов $ http, даже если входные данные различныответ приходит тот же.Как правильно структурировать код для этого случая?Могу ли я использовать обещание, чтобы решить эту проблему.Если да, то как, учитывая, что это тот же самый вызов $ http, который вызывается с разными входами.

 Utils.directive('setDescription', function ($q,$http,$timeout) {
                var directive = {};
                directive.priority = 1;
                directive.restrict = 'A'; 
                directive.require = 'ngModel';
                directive.link = function(scope,element,attributes,ngModel) {
                    scope.isInput = false;
                    scope.getDescription = true;
                    scope.elementArray = [];
                    element.bind("keypress", function (event) {
                       scope.isInput = true;
                       return true; 
                    });

                    scope.$watch(function(){
                        var codeElem = element.next();
                        if(codeElem[0]!=undefined){
                            codeElem=codeElem[0];
                        }
                        return scope.gettheObject(codeElem.name,scope);
                    },function(newValue,oldValue){
                        if(!scope.isInput && scope.getDescription){
                          if(newValue!=undefined && (newValue.trim())!=""){
                            $timeout(function() {
                                element.val(newValue);       
                                scope.elementArray.push(element);
                                $http({
                                    method: 'POST', 
                                    url: Constants.BASE_REST_URL + '/picklist/pickListResultGeneric',                   
                                    data : CryptoHelperService.getEncryptedData(searchstr,true),
                                    headers: CryptoHelperService.getEncryptionHeaders(),
                                    cache: false,
                                    xsrfCookieName : 'nicAccessCookie'
                                }).then(function(response) {
                                    response.data = CryptoHelperService.getDecryptedResponse(response.data,response.headers);
                                });
                            });
                          }
                        }   
                    });
                }
                return directive;
            });

1 Ответ

0 голосов
/ 19 июня 2018

Решено с помощью обещаний.Использование $q.when() (что совпадает с $q.resolve()), создает обещание, которое немедленно разрешается с данным значением.Для каждого элемента в массиве вызов $http создается и добавляется в цепочку обещаний.Как только все элементы повторяются, каждый вызов вызывается в том же порядке, в котором они были добавлены в цепочку.

 var promiseChain = $q.when();
    scope.elementArray.forEach(function(elem) {
          //Initiate a chain of promises for each REST call
           promiseChain = promiseChain.then(function() {
             return $http({
                            method: 'POST', 
                            url: someURL,       
                            data : someData
                        });
           });  
           //Each promise in the chain is then resolved individually in the order in which they were invoked.
           promiseChain.then(function(response) {
                //do stuff here after each call returns individually                
           });                      
    }); 
...