簡體   English   中英

AngularJS鏈式承諾僅工作一次

[英]AngularJS Chained Promises only work once

我有一個功能,可以根據用戶對復選框的選擇來檢索大量數據。 如果用戶選擇“全部”,則該函數使用鏈接的承諾根據每個復選框的“ id”來獲取所選數據。 用戶第一次選擇“全部”時,它可以完美運行。 但是,如果用戶取消選擇“全部”,然后再次選擇“全部”,則鏈接的承諾不再鏈接。 它達到了第一個承諾,然后停滯了。 如果刷新頁面,則鏈接的諾言將再次起作用。 下面的代碼僅是表達“一般想法”的摘要,因為其中涉及很多代碼。 不知何故似乎沒有兌現原始的承諾,但是由於我沒有收到任何錯誤,所以我無法弄清問題。

當用戶單擊“全選”按鈕時,將調用此功能。

      $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”通過其“ id”獲取每個節的數據。 這不是該函數的全部代碼,因為它很長。

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

問題是第二次出現,鏈接promise的“ next()”函數不起作用。 非常感謝您的協助!

以下內容幾乎是您的代碼的副本,但沒有Promise $q包裝器。 我認為唯一可能丟失的是switchdefault選項,當大小寫不匹配時發送空白承諾。

 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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM