Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript奇怪的执行顺序(循环等)_Javascript_Jquery_Angularjs - Fatal编程技术网

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

Javascript奇怪的执行顺序(循环等),javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我很难理解javascript中执行内容的顺序。。。它似乎完全没有遵循我从Java习惯的顺序。有人能建议如何强制执行正确的命令吗 我希望首先完成GetRegisteredUserList,它将为getAllUsersActivityCount提供第一个参数,即数组 然后,对于该数组的每个元素,我希望getAllUsersActivityCount对其执行CountActivities for User。不幸的是,这并不像预期的那样有效 我有以下方法: $scope.count = functio

我很难理解javascript中执行内容的顺序。。。它似乎完全没有遵循我从Java习惯的顺序。有人能建议如何强制执行正确的命令吗

我希望首先完成GetRegisteredUserList,它将为get
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不需要,您可以使用回调或承诺模式。检查我现在编辑的帖子中的这个问题。另外,那些
返回数据
语句不会向外部函数返回任何内容……本质上,您需要调用在回调中“等待”某个值的函数(而不是调用会触发回调的函数)