AngularJS Chained Promises只能使用一次

时间:2017-01-16 17:28:30

标签: javascript angularjs

我有一个函数可以根据用户选中的复选框检索大量数据。如果用户选择"全部",该功能使用链式承诺根据" id"来获取所选数据。每个复选框。它在用户第一次选择" All"时完美地工作。但是,如果用户取消选择"全部"然后选择"全部"再次,链式承诺不再链接。这是第一个承诺,然后停止。如果页面刷新,链接的承诺将再次起作用。下面的代码只是一个片段,用于展示"一般的想法"因为涉及很多代码。不知怎的,似乎原来的承诺没有被清除或者什么,但我无法弄清楚这个问题,因为我没有收到任何错误。

当用户点击"选择全部"按钮。

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

然后,当用户单击" Print Selected"时,将调用以下函数:

  $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();



  };

功能&#34; getSectionData&#34;通过其&#34; id&#34;获取每个部分的数据。这不是这个函数的所有代码,因为它很长。

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;
}

问题是第二次,&#34; next()&#34;链接承诺的功能不起作用。 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

以下几乎是代码的副本,但$q没有Promise封装器。我认为唯一可能遗漏的是default中的switch选项,以便在案例不匹配时发送空白承诺。

&#13;
&#13;
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'
  });
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre>
  
</pre>
&#13;
&#13;
&#13;