我在单独的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
,那么数组就可以正常填充,但是其他数组是空的,我想知道它为什么会发生。
谢谢。
答案 0 :(得分:1)
您必须返回 GetUsers
,GetObGroups
和GetObjects
中的承诺,否则Q.all
无法完成任务。
因此,例如:
GetUsers: function ($http) {
return $http({
....
应该这样做。