面对AngularJs中的同步调用问题

时间:2017-05-31 08:03:58

标签: javascript angularjs typescript q

我有两个服务调用,我想按顺序同步执行。但即使我使用promises也没有发生。

控制器:

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)没有完全执行,而是归结为其他.then方法,即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;
    }

1 个答案:

答案 0 :(得分:0)

根据您的代码,预期的行为应该是:   - 执行vm.nominationSVC.zipping   - 当解析vm.nominationSVC.zipping返回的promise时,then()后面的三个将被称为顺序。那不是一个好习惯。

每个promise只应使用一次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个旧的then()调用(我假设vm.nominationSVC.downloadDocument是同步的并且不返回一个promise)。

我希望它会有所帮助