使用Angular js逐个调用多个web api

时间:2016-10-06 05:04:15

标签: angularjs asp.net-web-api angular-promise

我有一个场景,其中有8个web api被称为:

#1 
Sync Local DB from server DB (response will RETURN a List=> myList)         
If (myList.Length > 0)
#1.1 Call web Api to Insert/Update Local DB
#2 
Sync Server DB from Local DB  (Request goes with a List=> myList)
            If (myList.Length > 0)
#2.1 Call web Api to Insert/Update in Server DB (Response will RETURN a List=> newList)
If(newList.length > 0)
#2.2 Call web Api to Insert/Update in Local DB

我有两个单独的过程For Head and Head Collection表,与上述过程同步。所以还有#3和#4场景也存在。

我以下列方式呼叫web api ......

syncHeadDataLogic();
syncHeadCollectionDataLogic();

我需要首先同步Head数据然后同步HeadCollection数据。但如果头部没有更新记录,则执行Head集合。 在我的场景中,我的web apis以任何顺序调用,但我需要一个订单,如上所述。请建议我如何实现这一目标。

#Updated

 //Sync  Head


        $scope.initializeController = function () {
            if ($scope.online) {
                //debugger;
                syncHeadDataLogic();
                syncHeadCollectionDataLogic();

            }
        };

        function syncHeadDataLogic() {
            HeadService.HeadSyncLocalDB(parseInt(localStorage.headRevision, 10), $scope.completeds, $scope.erroe);
        };

        $scope.SynServerDBCompleted = function (response) {
            debugger;
            $scope.HeadListForSync = response.HeadList;

            var tempHeadCurrencyDetail = [];
            if ($scope.HeadListForSync.length > 0) {

                angular.forEach($scope.HeadListForSync, function (xx) {
                    xx.CurrencyId = xx.CurrencyServerId;
                    xx.Id = xx.HeadServerId;
                    angular.forEach(xx.HeadCurrencyDetail, function (yy) {
                        yy.CurrencyId = yy.CurrencyServerId;
                        yy.HeadId = xx.HeadServerId;

                        if (yy.Revision == -1)
                            tempHeadCurrencyDetail.push(yy);
                    });
                    xx.HeadCurrencyDetail = tempHeadCurrencyDetail;
                });


                var postData = { Revision: parseInt(localStorage.headRevision, 10), HeadList: $scope.HeadListForSync };
                HeadService.SynServerDB(postData, $scope.completed, $scope.erroe);
            }
            else {
              //  alertsService.RenderSuccessMessage("There is no change in data after your last synchronization.");
            }


        };

        $scope.requestErrorwer = function (response) {
            debugger;
        };


        $scope.completed = function (response) {
            debugger;
            if (response.RevisionNo == localStorage.headRevision) {
                syncHeadCollectionDataLogic();
               // alertsService.RenderErrorMessage("There is newer version on the server. Please Sync from server first.", "MessageAlert");
            }
            else {
                syncData(response);
            }

        };
        $scope.completeds = function (response) {
            debugger;
            if (response.RevisionNo == localStorage.headRevision) {
                syncHeadCollectionDataLogic();
              //  alertsService.RenderSuccessMessage("You are already working on the latest version", "MessageAlert");
            }
            else {
                syncData(response);
            }

            //
            var request = new Object();
            HeadService.getAllHeadForRevision(request, $scope.SynServerDBCompleted, $scope.requestErrorwer);
        };
        $scope.erroe = function (response) {
            debugger;
           // alertsService.RenderErrorMessage("Data Synchronization Failed", "MessageAlert");
        };
        function syncData(data) {
            debugger;
            $scope.ReturnedRevisonNo = data.RevisionNo;
            if (data.HeadList && data.HeadList.length > 0) {
                var postData = { Revision: $scope.ReturnedRevisonNo, HeadList: data.HeadList, HeadRevision: $scope.ReturnedRevisonNo };
                HeadService.AddUpdateHeadAfterSync(postData, $scope.cmpSync, $scope.Error);
            }
            else {
                syncHeadCollectionDataLogic();
            }

        };
        $scope.cmpSync = function (response) {
            debugger;
            localStorage.headRevision = $scope.ReturnedRevisonNo;;
            alertsService.RenderSuccessMessage("The synchronization has been completed successfully.");
            syncHeadCollectionDataLogic();
        };

        $scope.Error = function (response) {
            debugger;
         //   alertsService.RenderErrorMessage(response.ReturnMessage);
         //   alertsService.SetValidationErrors($scope, response.ValidationErrors);
        };
        ////////////Sync End


        //Sync Head Collection


        function syncHeadCollectionDataLogic() {
            HeadService.HeadSyncLocalCollectionDB(parseInt(localStorage.headCollectionRevision, 10), $scope.completedCollections, $scope.erroeCollection);
        };


        $scope.SynServerDBCompletedCollection = function (response) {
            $scope.HeadCollectionListForSync = response.HeadCollectionList;
            if ($scope.HeadCollectionListForSync.length > 0) {
                angular.forEach($scope.HeadCollectionListForSync, function (value, index) {
                    value.Id = value.HeadCollectionServerId;
                    angular.forEach(value.HeadCollectionDetails, function (v) {
                        v.CommittedCurrencyId = v.CommittedCurrencyServerId;
                        v.HeadId = v.HeadServerId;
                        v.WeightId = v.WeightServerId;
                        v.HeadCollectionId = value.HeadCollectionServerId; //change

                        angular.forEach(v.HeadCollectionAmountDetails, function (xx) {
                            xx.CurrencyId = xx.CurrencyServerId;
                        });

                    });

                });
                var postData = { Revision: parseInt(localStorage.headCollectionRevision, 10), HeadCollectionList: $scope.HeadCollectionListForSync };
                HeadService.SynServerCollectionDB(postData, $scope.completedCollection, $scope.erroeCollection);
            }
            else {
               // alertsService.RenderSuccessMessage("There is no change in data after your last synchronization.");
            }


        };

        $scope.requestErrorwerCollection = function (response) {
        };


        $scope.completedCollection = function (response) {
            if (response.RevisionNo == localStorage.headCollectionRevision) {
               // alertsService.RenderErrorMessage("There is newer version on the server. Please Sync from server first.", "MessageAlert");
            }
            else {
                syncDataCollection(response);
            }

        };
        $scope.completedCollections = function (response) {
            if (response.RevisionNo == localStorage.headCollectionRevision) {
               // alertsService.RenderSuccessMessage("You are already working on the latest version", "MessageAlert");
            }
            else {
                syncDataCollection(response);
            }
            var request = new Object();
            HeadService.getAllHeadCollectionForRevision(request, $scope.SynServerDBCompletedCollection, $scope.requestErrorwerCollection);
        };
        $scope.erroeCollection = function (response) {
           // alertsService.RenderErrorMessage("Data Synchronization Failed", "MessageAlert");
        };
        function syncDataCollection(data) {
            $scope.ReturnedRevisonNo = data.RevisionNo;
            if (data.HeadCollectionList && data.HeadCollectionList.length > 0) {
                var postData = { Revision: $scope.ReturnedRevisonNo, HeadCollectionList: data.HeadCollectionList, HeadRevision: $scope.ReturnedRevisonNo };
                HeadService.AddUpdateaHeadCollectionAfterSync(postData, $scope.cmpSyncCollection, $scope.ErrorCollection);
            }
        };
        $scope.cmpSyncCollection = function (response) {
            localStorage.headCollectionRevision = $scope.ReturnedRevisonNo;;
            alertsService.RenderSuccessMessage("The synchronization has been completed successfully.");
            $scope.initializeController();
        };

        $scope.ErrorCollection = function (response) {
          //  alertsService.RenderErrorMessage(response.ReturnMessage);
          //  alertsService.SetValidationErrors($scope, response.ValidationErrors);
        }
        //End

1 个答案:

答案 0 :(得分:0)

  

我需要首先同步Head数据然后同步HeadCollection数据。但如果头部没有更新记录,则执行Head集合。

你需要的是链式承诺。试试这个(我现在给你假代码):

HeadService.HeadData
|-----------------|
                  HeadCollection(headDataResult)
                  |------------------|
                                     finalHandler(headCollectionResult)
                                     |------------------|




HeadService.HeadData()
    .then(HeadService.HeadCollection) // return or throw Err if headDataResult is empty
    .then(finalHandler);

这里,承诺的执行顺序是可预测的,也是顺序的。此外,每个承诺将返回先前承诺的已解决价值

AngularJS,你可以在这里的文档中看到,使用带有$http注入的开箱即用Promise。您可以像这样定义工厂:

// Factory code
.factory("SampleFactory", function SampleFactory($http) {
  var sampleFactoryObject = {};
  sampleFactoryObject.getSomething = function() {
    return $http.get('/someUrl');
  }
  sampleFactoryObject.getSomething.then(function resolveHandler(res) {
    return res;
  },
  function rejectHandler(err) {
    throw new Error(err);
  });
  sampleFactoryObject.getSomethingElse = function() {
    return $http.get('/someOtherUrl');
  }
  sampleFactoryObject.getSomethingElse.then(function resolveHandler(res) {
    return res;
  },
  function rejectHandler(err) {
    throw new Error(err);
  });
  return sampleFactoryObject;
});

// Controller code
.controller('myController', function myController(SampleFactory) {
  SampleFactory.getSomething()
    .then(SampleFactory.getSomethingElse())
    .then(finalHandler);

var finalHandler = function(resultOfGetSomethingElse) {
    console.log(resultOfGetSomethingElse);
  }
});