Q.all.then不等待完成

时间:2016-04-24 12:49:54

标签: angularjs asynchronous

我在单独的JS文件中有一个服务,这个服务就像OOP类,它包含从Web加载必要数据的'方法'。

我想调用那些'方法'并在我的主JS文件中获取数据,实际上我想加载三种类型的数据并强制JS流等待直到检索到数据,这是我的代码:

services.js

// My 'Class' to load data from the web server
myApp.factory("LoadData", ["_gl", function (_gl) {
    return {        
        GetUsers: function ($http) {
            $http({
                method: 'POST',
                url: 'http://localhost/dgis/ps/select.php',
                data: { "action": "GetUsers" }
            }).then(function successCallback(response) {
                // Save the response JSON object to my global objects
                _gl.myUsers = response.data;
            }, function errorCallback(response) {
                console.log("GetUsersError:" + response);
            });
        },
        GetObGroups: function ($http) {
            $http({
                method: 'POST',
                url: 'http://localhost/dgis/ps/select.php',
                data: { "action": "GetObGroups" }
            }).then(function successCallback(response) {
                // Save the response JSON object to my global objects
                // This code fills array because it iterates through it

                angular.forEach(response.data, function (value, key) {
                    _gl.myObGroups.push(value)
                });
            }, function errorCallback(response) {
                console.log("GetObGroups:" + response);
            });
        },
        GetObjects: function ($http) {
            $http({
                method: 'POST',
                url: 'http://localhost/dgis/ps/select.php',
                data: { "action": "GetObjects" }
            }).then(function successCallback(response) {
                _gl.myObjects = response.data;
            }, function errorCallback(response) {
                console.log("GetObjectsError:" + response);
            });
        }
    }
}]);

// My global variables
myApp.factory('_gl', function () {
    return {
        myUsers: [],
        myOrganisations: [],
        myObGroups: [],
        myObjects: []
    }
});

的script.js

 Q.all([LoadData.GetUsers($http), LoadData.GetObGroups($http),  LoadData.GetObjects($http)]).then(function () {
          console.log(_gl.myUsers);
          console.log(_gl.myObGroups);
          console.log(_gl.myObjects);     
      });

问题是,Q.all不会等到所有http请求都获取数据,它会在then之前评估调用。当然,我可以使用一些计时器,等待一秒钟,但我想要更合适的方法,请分享你的知识。

还有一件事,如果我在我的get方法的forEach中使用then,那么数组就可以正常填充,但是其他数组是空的,我想知道它为什么会发生。

谢谢。

1 个答案:

答案 0 :(得分:1)

您必须返回 GetUsersGetObGroupsGetObjects中的承诺,否则Q.all无法完成任务。

因此,例如:

GetUsers: function ($http) {
        return $http({
        ....

应该这样做。