2017-05-31 60 views
0

我有兩個服務調用,我想按順序同步執行,但即使在使用承諾時也不會發生這種情況。面對AngularJs中的同步調用問題

控制器:

vm.nominationSVC.zipping(vm.fileSelected, vm.selectedCategoryId). 
      then(function (response: any) { //Zipping 
       vm.nominationSVC.downloadDocument("documents.zip"); 
      }). 
      then(function (response: any) { 
       var deffered = vm.$q.defer(); 
       for (i = 0; i < vm.rowSelectedLength; i++) { 
        vm.objDownloadHistory.Nomination_Id = vm.nominationIdSelected[i]; 
        vm.objDownloadHistory.FilePath = vm.fileNamesSelected[i]; 
        vm.promises.push(vm.nominationSVC.updateDownloadHistory(vm.objDownloadHistory)); 
       } 
       // vm.$q.all(vm.promises).then(function() { 
       //  console.log("sdsd"); 
      // }); 
      }). 
      then(function (response: any) { 
     vm.getNomiantionList(); 
     }); 

方法vm.nominationSVC.updateDownloadHistory(vm.objDownloadHistory)不完全執行並歸結爲其他方法。然後即vm.getNomiantionList();

我試過使用$ q.all也是在註釋代碼中提到的,但仍然無法解決此問題。

服務方法:

updateDownloadHistory(objDownloadHistory: SpotAward.DownloadHistory) 
     { 
     var vm = this; 
     var url: any; 

     var deferred = this.$q.defer(); 
     url = this.BaseUrl + 'DownloadHistory/UpdateDownload'; 
     if (url !== null) { 
      this.$http.post(
       url, 
       JSON.stringify(objDownloadHistory), 
       { 
        headers: { 
         'Content-Type': 'application/json' 
        } 
       } 
      ).then(function (result: any) { 
       if (result.data > 0) 
        deferred.resolve(result.data); 
      }).catch((data) => { 
       deferred.reject(data); 
      }); 
     } 


     return deferred.promise; 
    } 

回答

0

根據你的代碼,預期的行爲應該是: - vm.nominationSVC.zipping 的執行 - 當vm.nominationSVC.zipping返回的承諾得到解決後,隨後的三個()將按順序稱爲。這不是一個好習慣。

您應該只使用一個then()調用每個承諾,它允許您可視化回調鏈。嘗試是這樣的:

vm.nominationSVC.zipping(vm.fileSelected, vm.selectedCategoryId). 
     then(function (response: any) { //Zipping 
      vm.nominationSVC.downloadDocument("documents.zip"); 

      var deffered = vm.$q.defer(); 
      var promises = []; 
      for (i = 0; i < vm.rowSelectedLength; i++) { 
       vm.objDownloadHistory.Nomination_Id =vm.nominationIdSelected[i]; 
       vm.objDownloadHistory.FilePath = vm.fileNamesSelected[i]; 
       promises.push(vm.nominationSVC.updateDownloadHistory(vm.objDownloadHistory)); 
      } 

      $q.all(promises).then(function() { 
       vm.getNomiantionList(); 
      }); 
     }); 

在這種情況下,3歲則()調用將被依次調用(我在這裏假設vm.nominationSVC.downloadDocument是同步的,不返回的承諾)。我希望這會有幫助