2016-10-06 7 views
0

によって角度JS 1を使用して、複数のWeb APIを私はと呼ばれる8ウェブAPIのが存在するシナリオがあります。コール1

#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 

を私は上記のプロセスと同期頭と頭コレクションテーブルのための2つの別々のプロセスを持っています。したがって、#3と#4のシナリオも存在します。

私は次のように呼び出したWeb APIを持っている...

syncHeadDataLogic(); 
syncHeadCollectionDataLogic(); 

私は、データが同期さHeadCollectionヘッドデータは、その後最初に同期する必要があることを必要とします。しかし、ヘッドの更新されたレコードがない場合、ヘッドコレクションが実行されます。 私のシナリオでは、私のウェブ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 

答えて

0

私は頭のデータが同期され、最初のHeadCollectionデータを同期する必要があることを必要とします。しかし、ヘッドの更新されたレコードがない場合、ヘッドコレクションが実行されます。

あなたが必要とするのは連鎖約束です。 (私は今のあなたの擬似コードを与えている)、これを試してみてください:ここで

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




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

、約束の実行順序は予測可能で、かつシーケンシャルます。また、各約束は前回の約束の解決された値に戻されます

AngularJSは、ここに書かれているように、$httpの注射可能な約束をそのまま使用しています。次のようにファクトリを定義することができます。

// 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); 
    } 
}); 
+0

私はajax getおよびpostメソッドを使用しています。ここでヘッドコレクションはヘッドに依存しません。私の必要性は、私の8つのWeb APIが1つ1つを呼び出す必要があるということです。私は約束について知りません。私の8つのapiがどのように1つずつ呼び出されたかの例を教えてください。 – coolForNet

+0

回答udpdated – nikjohn