2017-03-10 11 views
2

からの結果を用いてangularJS、1で解決した後、私はいくつかの操作を行います。通話機能2つの約束はコントローラ機能では、他の

  • は、この約束のでは約束
  • と組織のリストを取得します。 、私はそれらのそれぞれをループしていくつかのデータを抽出し、私のコントローラの属性のいくつかを設定します。
  • この操作の1つは、この組織に接続されているすべてのユーザーを収集するための別の約束を呼び出して、内部にループを付けて名前などを抽出することです。
  • 私はそれをすべて取得するので、すべての組織が解析され、それらのすべてのユーザーも、ビューを更新する関数を呼び出す必要があります。

私はいくつかのフラグ(orgParsedusersParsed)を設定して動作していますが、それはコード恥ずかしがり屋です。

$qを使用して2つの約束を待ち、おそらく "then"内のループを解決して、自分のビュー関数を呼び出す前に解決する方法について聞いたことがあります。しかし、私は2番目の約束が組織IDを収集するために最初の結果を使用するので、このコード変更を適用するのに苦労します。ここで

私の現在のコードです:

this.getOrgData = function() { 
    return Service.getList().then(function (result) { 
     var orgCount = result.Objects.length; 
     var orgParsed = 0; 

     _.forEach(result.Objects, function (org) { 
      org.Users = []; 

      // Some logic here using 'org' data 

      Service.getUsers(org.Id, 0, 0).then(function (userResult) {       
       usersParsed = 0; 

       _.forEach(userResult.Objects, function (user) { 
        // Some Logic here using 'user.Name'    
        usersParsed++;       
       }); 
       orgParsed++; 

       if (orgParsed === orgCount && usersParsed === userResult.Objects.length) { 
        self.sortMenuList(); // My view Function 
       } 
      }); 
     }); 
     $scope.$broadcast("getOrgData"); 
    }); 
}; 

あなたは私がすべての会社のすべてのユーザーが効率的/よりエレガントに解析されてしまったことを確認することができた場合にのみ、私のself.sortMenuList()関数をトリガする方法を参照しています/安全な方法?

+0

「usersParsed」には何が必要ですか?そして、 'doneUsers'は何ですか? – Bergi

+0

$ q.all()は、複数のエンドポイント呼び出しの結果を待つ角度の方法です* – Kraken

+0

doneUsersは間違いでした。 – BlackHoleGalaxy

答えて

2

はい、そのカウントは間違いなくあなたはすべてのエラーを処理するために気にしませんでした、特にとして、$q.allで交換する必要があります。

this.getOrgData = function() { 
    return Service.getList().then(function (result) { 
     $scope.$broadcast("getOrgData"); // not sure whether you want that here before the results from the loop 
     return $q.all(_.map(result.Objects, function (org) { 
      org.Users = []; 
      // Some logic here using 'org' data 
      return Service.getUsers(org.Id, 0, 0).then(function (userResult) { 
       _.forEach(userResult.Objects, function (user) { 
        // Some Logic here using 'user.Name' 
       }); 
      }); 
     })); 
    }).then(function() { 
     self.sortMenuList(); // My view Function; 
    }) 
}; 
+0

ありがとう – BlackHoleGalaxy

1

あなたが説明している問題は、一定量の約束がすべて解決されるまで待ってから、その結果で何かをやりたいと思うように思えます。あなたがPromise.all()を使用する場合それは本当に簡単です:

this.getOrgData = function() { 
    return Service.getList().then(function (result) { 
     var promises = []; 

     _.forEach(result.Objects, function (org) { 
      org.Users = []; 

      // Some logic here using 'org' data 

      // Store the promise for this user in the promises array 
      promises.push(Service.getUsers(org.Id, 0, 0)); 
     }); 


     // userResults is an array of all the results of the promises, in the same order as the getUsers was called 
     Promise.all(promises).then(function (userResults) { 
      _.forEach(userResults, function(userResult) {       
       _.forEach(userResult.Objects, function (user) { 
        // Some Logic here using 'user.Name'    
       }); 
      }); 

      self.sortMenuList(); 
     }); 

     $scope.$broadcast("getOrgData"); 
    }); 
}; 
+0

ありがとう、非常に便利ですが、私は '$ q.all'と一緒に行く – BlackHoleGalaxy

関連する問題