2017-01-16 4 views
0

У меня есть функция, которая извлекает много данных на основе выбора пользователем флажков. Если пользователь выбирает «Все», функция использует прикованные обещания для извлечения выбранных данных на основе «id» каждого флажка. Он отлично работает в первый раз, когда пользователь выбирает «Все». Однако, если пользователь отменяет выбор «Все», то снова выбирает «Все», цепочка обещает больше не цепочки. Это идет к первому обещанию, а затем киоски. Если страница обновляется, то прикованные обещания будут работать снова. Код ниже - всего лишь фрагмент, чтобы представить «общую идею», потому что в нем много кода. Как-то кажется, что первоначальные обещания не очищены или что-то в этом роде, но я не могу понять этот вопрос, так как я не получаю никаких ошибок.AngularJS Chained Promises работает только один раз

Эта функция вызывается, когда пользователь нажимает кнопку «Выбрать все».

 $scope.selectAll = function() { 
    $scope.print.sections = angular.copy($scope.sections); 
    }; 

Затем, когда пользователь нажимает кнопку «Печать выбранных», следующая функция называется:

$scope.printSections = function() { 
    var promise = null; 
    $scope.print.sections.sort(setOrder); 
    $scope.dataLoading = true; 

      var cntr = 0; 
      var sections = $scope.print.sections; 
      function next() { 
       if (cntr < sections.length) { 
        promise = getSectionData(sections[cntr++]); 
        promise.then(next); 
       } 
      } 
      next(); 



    }; 

Функция «getSectionData» получает данные для каждого раздела его «ид». Это не весь код для этой функции, поскольку он очень длинный.

function getSectionData(section) { 
    var deferred; 
    deferred = $q.defer(); 
    var id = section.QuestionSectionID; 
    switch (id) { 
     case 1: 

      deferred.resolve(myService.getfirstSection(id) 
      .success(function (data) { 
       $scope.firstSection = data; 
      })); 

     break; 
    case 2: 
      deferred.resolve(myService.getSecondSection(id) 
      .success(function (data) { 
       $scope.secondSection= data; 
      })); 

     break; 
    } 
return deferred.promise; 
} 

Проблема во втором случае, функция «next()», которая связывает обещания, не работает. Любая помощь очень ценится!

ответ

0

Следующая копия вашего кода, но без $q обертка для Promise. Единственное, что, я думаю, может отсутствовать, это опция default в switch, чтобы отправить пустое обещание, если случай не совпадает.

var cntr = 0; 
 
var sections = [1, 2, 989878, 3]; //data for 989878 does not exist 
 

 
function next() { 
 
    if (cntr < sections.length) { 
 
    promise = getSectionData(sections[cntr++]); 
 
    promise.then(next); 
 
    } 
 
} 
 
next(); 
 

 
function getSectionData(id) { 
 

 
    var deferred = null; 
 
    switch (id) { 
 
    case 1: 
 
     deferred = Promise.resolve(getOtherData(id).success(function(data) { 
 
     $('pre').append(JSON.stringify(data[0], {}, ' ')); 
 
     })); 
 
     break; 
 
    case 2: 
 
     deferred = Promise.resolve(getOtherData(id).success(function(data) { 
 
     $('pre').append(JSON.stringify(data[0], {}, ' ')); 
 
     })); 
 
     break; 
 
    case 3: 
 
     deferred = Promise.resolve(getOtherData(id).success(function(data) { 
 
     $('pre').append(JSON.stringify(data[0], {}, ' ')); 
 
     })) 
 
     break; 
 
    default: //return a default promise object. Comment the default out and see what happens 
 
     deferred = Promise.resolve(true); 
 
     break; 
 
    } 
 
    return deferred; 
 
} 
 

 
function getOtherData(id) { 
 
    return $.ajax({ 
 
    url: 'https://jsonplaceholder.typicode.com/users?id=' + id, 
 
    method: 'GET' 
 
    }); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<pre> 
 
    
 
</pre>

Смежные вопросы