Javascript奇怪的执行顺序(循环等)

时间:2013-06-05 04:31:31

标签: javascript jquery angularjs

我无法理解在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;
    }
    );

};

2 个答案:

答案 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 - 但其他函数已经完全执行完毕,所以没有办法影响他们的回报价值。