2013-06-05 28 views
0

我无法理解的东西在JavaScript中执行的顺序...它似乎完全不遵循我习惯于从Java的顺序。任何人都可以建议如何强制正确的顺序?JavaScript奇怪的执行顺序(循环等)

我想要getRegisteredUsersList首先完成,这将提供获取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

您只定义函数但不调用它们 – mrida

+2

您正在运行异步代码,它不遵循常规流程,它会在执行时执行。异步代码中的返回值无用,您可以使用回调或承诺模式。检查这个问题http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – elclanrs

+0

我现在编辑帖子。 – LucasSeveryn

回答

1

的问题是,在getRegisteredUserList,你执行一个异步调用$ http.get()。 执行此操作时,新线程执行get()操作,之后执行success()回调。

1.)当get()操作完成时,getRegisteredUsersList已经完成执行了。

2.)你似乎期待“返回数据”语句返回一些getAllUsersActivityCount事实上它不会工作,因为“返回数据”是在回调函数内。 (即当你的代码到达“返回数据”语句时,你试图从成功回调中返回值而不是返回一个值给getRegisteredUsersList调用者)

0

什么导致混淆是你的ajax回调getRegisteredUsersList函数。

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行只是定义一个函数,而不是execting它。该函数然后作为参数传递给$http.get()调用 - 仍然不执行该函数。 $http.get()是异步的,这意味着它启动ajax调用并立即返回。它仍然不执行callbackFn函数。所以getRegisteredUsersList()完成执行,并且getAllUsersActivityCount()函数将按照您的期望执行。当ajax调用最终完成时(可能是毫秒,秒,分钟,小时 - 从代码的角度来看,没办法告诉),然后执行回调函数 - 但其他函数在这一点上已经完全执行完毕,所以没有办法影响他们的回报价值。

+0

您能否建议如何重构代码以解决我的问题? – LucasSeveryn