2016-01-18 160 views
1

我想構建一個機制,通過POST請求訪問數據庫。到目前爲止,我確實收到了所需的數據,但我在時間上遇到了問題。以下是我正在使用的三段代碼(簡化以保持問題的重點)。角度使僞同步HTTP請求

首先,工廠處理HTTP請求面對面的人一個servlet:

var My_Web = angular.module('My_Web'); 

My_Web.factory('DB_Services', function($http , $q) { 
    var l_Result ; 
    var DB_Services = function(p_Query) { 
          var deferred = $q.defer(); 
          var url  = "http://localhost:8080/demo/servlets/servlet/Test_ui?"; 
          var params = "data=" + p_Query ; 
          var Sending = url + params ; 

          $http.post(Sending). 
             success(function(data, status, headers, config) { 
              deferred.resolve(data); 
             }). 
             error(function(data, status, headers, config) { 
              deferred.reject(status); 
             }); 
             return deferred.promise; 

         } 

    return DB_Services; 
    }); 

其次,通用函數處理promise(或所以我的意思)暴露於會需要的所有控制器

$scope.Search_Lookups = function() { 

    console.log ("search for lookup data...") ; 

    var l_Lookup_Type = document.getElementById("THISONE").value ; 

    var l_Send_Request_Data = '{"Requestor_ID":"4321" , "Request_Details" : { "Data_type" : "' + l_Lookup_Type + '" } }' ; 

    console.log("Sending Request: " + l_Send_Request_Data) ; 

    l_Data = $rootScope.Get_Data_from_DB(p_Query) ; 

    console.log ("Received response: " + l_Data) ; 

    Deploy_data(l_Data) ; 

} 
0:控制器之一內

$rootScope.Get_Data_from_DB = function(p_Query) { 
    DB_Services(p_Query).then(function(d) { 
     console.log("In Get_Data_from_DB; Received data is: " + JSON.stringify(d)); 
     $scope.data = d; 
    }); 
};      

第三,一個例子:提取從遠程DB數據

功能Deploy_data(l_Data)負責分解接收到的數據並將相關的部分放在屏幕上。

會發生什麼事情,我在控制檯上得到字符串Received response: undefined和檢索結果後立即作爲In Get_Data_from_DB; Received data is: (here I get the data)

Received response: undefined是從調用函數(第三段代碼)打印的,而帶有實際數據的輸出是從上面的第二段代碼中接收和打印的。這意味着對Deploy_data的調用將不會收到提取的數據。

再一次,相同的機制(即工廠$ rootScope.Get_Data_from_DB)將被許多控制器廣泛使用。

我想過使用$scope.$watch,但我不確定,因爲同一用戶可能同時觸發多個查詢(例如,請求一個可能需要幾秒鐘才能到達的報告,同時請求其他內容)。

任何建議將不勝感激。

+0

因此你需要級聯調用?這些通話是否相互依賴? – Radu

+0

對不起,但我不確定我瞭解你的問題。調用序列爲:(從控制器內)Search_Lookups - > $ rootScope.Get_Data_from_DB - > DB_Services。這是你問的嗎? – FDavidov

+0

忘記了你的名字@Radu。對不起,但我不確定我瞭解你的問題。調用序列爲:(從控制器內)Search_Lookups - > $ rootScope.Get_Data_from_DB - > DB_Services。這是你問的嗎? – FDavidov

回答

1

我想我找到了一個解決方案(至少目前看起來沒問題)。全局函數Get_Data_from_DB接受第二個參數,它是調用控制器的回調函數。

調用控制器創建Get_Data_from_DB函數的私有實例並觸發提供回調函數的請求。

我需要用並行查詢來測試這個,但這還有很長的路要走......