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.) ほとんどの場合、get() 操作が完了すると、getRegisteredUsersList はすでに実行を終了しています。

2.) 「データを返す」ステートメントが getAllUsersActivityCount に何かを返すことを期待しているようですが、実際には「データを返す」はコールバック関数内にあるため機能しません。(つまり、コードが「return data」ステートメントに到達するまでに、値を 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 に答える