角度制作伪同步HTTP请求

时间:2016-01-18 11:48:31

标签: javascript angularjs

我想构建一种通过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,但我不确定,因为同一个用户可能会同时触发多个查询(例如,请求报告可能需要几秒钟才能到达,同时请求为了别的什么)。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我想我找到了一个解决方案(至少暂时看起来还不错)。全局函数Get_Data_from_DB接受第二个参数,它是调用控制器的回调。

调用控制器创建Get_Data_from_DB函数的私有实例,并触发提供回调函数的请求。

我需要使用并行查询对此进行测试,但这还有很长的路要走......