我无法理解在javascript中执行内容的顺序......似乎它完全不符合我习惯使用Java的顺序。任何人都可以建议如何强制下订单吗?
我希望首先完成getRegisteredUsersList,这将为get AllUsersActivityCount
提供第一个参数,即一个数组。
然后,对于该数组的每个元素,我希望getAllUsersActivityCount
对其执行countActivitiesForUser
。不幸的是,这不能按预期工作。
我有以下方法:
$scope.count = function(){
var result = getAllUsersActivityCount(getRegisteredUsersList(),4);
return result;
};
getRegisteredUsersList = function(){
var url = "MY QUERY URL THAT RETURNS ARRAY OF USERS";
$http.get(url).success(
function(data, status, headers, config) {
return data;
}
);
};
getAllUsersActivityCount = function(usersList,type){
var sdf = new JsSimpleDateFormat("MMM d, yyyy");
var date = sdf.format(new Date());
var returnArray = [];
for(var i=0;i<usersList.length;i++){
var userid= usersList[i].userid;
var name= usersList[i].name;
returnArray.push({userid: userid, name: name, count: countActivitiesForUser(userid,type,date)});
}
return returnArray;
};
$scope.countActivitiesForUser = function(userid,type,date){
var url = "MY QUERY URL THAT RETURNS SINGLE NUMBERICAL VALUE";
$http.get(url).success(
function(data, status, headers, config) {
return data;
}
);
};
答案 0 :(得分:1)
问题是在getRegisteredUserList中,您对$ http.get()执行异步调用。 执行此操作时,新线程执行get()操作,之后执行success()回调。
1。)几乎总是这样,当get()操作完成时,getRegisteredUsersList已经完成执行。
2。)似乎你期望“返回数据”语句向getAllUsersActivityCount返回一些内容,而实际上它不起作用,因为“返回数据”在回调函数中。 (即,当您的代码到达“返回数据”语句时,您尝试从成功回调中返回值,而不是将值返回给getRegisteredUsersList调用者)
答案 1 :(得分:0)
造成混淆的是你的getRegisteredUsersList函数中的ajax回调。
getRegisteredUsersList = function(){
var url = "MY QUERY URL THAT RETURNS ARRAY OF USERS";
$http.get(url).success(
function(data, status, headers, config) {
return data;
}
);
};
如果我改写它,它可能会让它更清晰一些。此代码在功能上完全等同于您的原始功能:
getRegisteredUsersList = function(){
var url = "MY QUERY URL THAT RETURNS ARRAY OF USERS";
var callbackFn = function(data, status, headers, config) {return data;}
$http.get(url).success(callbackFn);
};
正如您所看到的,callbackFn
行只是定义一个函数,而不是它的异常。然后该函数作为参数传递给$http.get()
调用 - 仍未执行该函数。 $http.get()
是异步的,这意味着它启动ajax调用并立即返回。它仍然不执行callbackFn函数。所以getRegisteredUsersList()完成执行,getAllUsersActivityCount()
函数按预期执行。当ajax调用最终完成时(可能是毫秒,秒,分钟,小时 - 从代码的角度来看,没有办法告诉),然后执行callbackFn - 但其他函数已经完全执行完毕,所以没有办法影响他们的回报价值。