0

我无法理解在 javascript 中执行内容的顺序......它似乎完全不符合我在 Java 中习惯的顺序。有人可以建议如何强制执行正确的命令吗?

我希望 getRegisteredUsersList 首先完成,这将为 getAllUsersActivityCount提供第一个参数,这是一个数组。

然后对于该数组的每个元素,我希望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;
    }
    );

};
4

2 回答 2

1

问题是在getRegisteredUserList 中,您执行了对$http.get() 的异步调用。执行此操作时,新线程将执行 get() 操作,然后执行 success() 回调。

1.) getRegisteredUsersList 几乎总是在 get() 操作完成时已经完成执行。

2.) 似乎您期望“返回数据”语句返回一些东西给 getAllUsersActivityCount,而实际上它不起作用,因为“返回数据”在回调函数中。(即当您的代码到达“返回数据”语句时,您正试图从成功回调中返回值,而不是向 getRegisteredUsersList 调用者返回值)

于 2013-06-05T04:49:07.073 回答
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 - 但此时其他函数已完全执行完毕,所以没有办法影响它们的返回值。

于 2013-06-05T04:54:52.293 回答