Javascript奇怪的执行顺序(循环等)
我很难理解javascript中执行内容的顺序。。。它似乎完全没有遵循我从Java习惯的顺序。有人能建议如何强制执行正确的命令吗 我希望首先完成GetRegisteredUserList,它将为getJavascript奇怪的执行顺序(循环等),javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我很难理解javascript中执行内容的顺序。。。它似乎完全没有遵循我从Java习惯的顺序。有人能建议如何强制执行正确的命令吗 我希望首先完成GetRegisteredUserList,它将为getAllUsersActivityCount提供第一个参数,即数组 然后,对于该数组的每个元素,我希望getAllUsersActivityCount对其执行CountActivities for User。不幸的是,这并不像预期的那样有效 我有以下方法: $scope.count = functio
AllUsersActivityCount
提供第一个参数,即数组
然后,对于该数组的每个元素,我希望getAllUsersActivityCount
对其执行CountActivities for User
。不幸的是,这并不像预期的那样有效
我有以下方法:
$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;
}
);
};
$scope.count=函数(){
var result=getAllUsersActivityCount(getRegisteredUserList(),4);
返回结果;
};
GetRegisteredUserList=函数(){
var url=“返回用户数组的我的查询url”;
$http.get(url).success(
函数(数据、状态、标题、配置){
返回数据;
}
);
};
getAllUsersActivityCount=函数(usersList,类型){
var sdf=新JSSimpleDataFormat(“MMM d,yyyy”);
var date=sdf.format(new date());
var returnArray=[];
对于(var i=0;i而言,问题在于在getRegisteredUserList中,对$http.get()执行异步调用。
执行此操作时,新线程将执行get()操作,然后执行success()回调
1.)get()操作完成后,GetRegisteredUserList几乎总是已经完成执行
2.)您似乎期望“return data”语句返回某些内容到getAllUsersActivityCount,但实际上它不起作用,因为“return data”在回调函数中。(即,当代码到达“return data”时)语句,您试图从成功回调返回值,而不是向GetRegisteredUserList调用方返回值)导致混淆的是GetRegisteredUserList函数中的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函数。因此getRegisteredUserList()完成执行,然后getAllUsersActivityCount()
函数按预期执行。当ajax调用最终完成时(可能是毫秒、秒、分、小时——从代码的角度看,没有办法判断),然后执行callbackFn-但此时其他函数已完全执行完毕,因此无法影响它们的返回值。您只定义函数,不调用它们。您运行的是异步代码,不遵循常规流程,它将在可能时执行。异步代码中的返回值为us不需要,您可以使用回调或承诺模式。检查我现在编辑的帖子中的这个问题。另外,那些返回数据语句不会向外部函数返回任何内容……本质上,您需要调用在回调中“等待”某个值的函数(而不是调用会触发回调的函数)