我想构建一种通过POST请求访问数据库的机制。到目前为止,我确实收到了所需的数据,但是我遇到了时间的问题。以下是我正在使用的三段代码(简化以保持问题的重点)。
首先,工厂处理与servlet相对的HTTP请求:
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
(或者我的意思)的通用函数暴露给需要从远程数据库中提取数据的所有控制器:
$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;
});
};
第三,其中一个控制器中的一个例子:
$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) ;
}
函数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 :(得分:1)
我想我找到了一个解决方案(至少暂时看起来还不错)。全局函数Get_Data_from_DB
接受第二个参数,它是调用控制器的回调。
调用控制器创建Get_Data_from_DB
函数的私有实例,并触发提供回调函数的请求。
我需要使用并行查询对此进行测试,但这还有很长的路要走......