2016-11-04 26 views
1

約束を返す方法についてはわかりません。私は、ネストされた方法で結果を返すようにしようとしたが、その後示すように、2つの異なる方法で結果を返すことを好むだろう:

$scope.relatedContacts = function (accountId) { 
       if (!lodash.isNil(accountId)) { 
        try { 
         return restangular.one('user') 
         .one('contactimages') 
         .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId }) 
         .then(function (response) { 
          return response.data;}); 
       } 
      } 

は、以下の例を修正することを好む:

$scope.relatedContacts = function (accountId) { 

         if (!lodash.isNil(accountId)) { 

          try { 
           var deferred = $q.defer(); 
            return restangular.one('user') 
            .one('contactimages') 
            .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId }) 
            return deferred.promise; 
           } 
          catch (err) { 
           $scope.contactsPopulated = false; 
          } 
         } 
        } 

    $scope.relatedContacts().then(function (response) { 
      //Some logic here   
    } 

現在、私は、取得しています:「例外TypeError:未定義の の 『を』プロパティを読み取ることができません」consistenについて覚え、すべてのすべての

答えて

0

まず

感謝cy。 。。isNil場合accountIdを設けない場合(あなたがTypeError: Cannot read property 'then' of undefined "エラーになりますあなたの関数は、いくつかのケースでは何も返さない可能

あなたはあなたの問題を解決するには、2つの方法があり

最初の方法:

$scope.relatedContacts = function (accountId) { 
    return $q(function(resolve, reject) { 
    if (!lodash.isNil(accountId)) { 
     try { 
     return restangular.one('user') 
      .one('contactimages') 
      .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId }) 
      .then(function(response) { 
      resolve(response.data) 
      }, reject); 
     } 
     catch (err) { 
     $scope.contactsPopulated = false; 
     reject(err); 
     } 
    } 
    }); 
}; 

(延期を使用して)第二の方法。

$scope.relatedContacts = function (accountId) { 
    var def = $q.defer(); 
    if (!lodash.isNil(accountId)) { 
    try { 
     restangular.one('user') 
     .one('contactimages') 
     .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId }) 
     .then(function(response) { 
      def.resolve(response.data) 
     }, def.reject); 
    } 
    catch (err) { 
     $scope.contactsPopulated = false; 
     def.reject(err); 
    } 
    } 
    return def; 
}; 

あなたは$qサービスに関する公式リファレンスを確認してください:一般的な約束の用法の多くの例があります https://docs.angularjs.org/api/ng/service/$q

+0

私は私のコントローラで$ qを最初に追加する方法のため、今エラーを取得:TypeError例外:$ qは関数ではありません。( 'SelectUserController'、[ '$スコープ'、 'PubSubの'、「Pnotify .controller '、' Common.InfiniteListService '、' SelectUserService '、' Restangular '、' $ q '、 関数($ scope、pubSub、pnotify、InfiniteListService、selectUserService、矩形、$ q){ –

+0

問題は実行したいですか –

+0

アカウントがnullでない場合にのみメソッドを呼び出すため、isNilが機能します。たとえば、プロミスが解決されたときに、ロジックが追加されていないかどうかチェックします。 –

0

これは私が値を返し、応答に対処するために追加のメソッドを追加するために使用したものです。

$scope.relatedContacts = function (accountId) { 

         var deferred = $q.defer(); 
         if (!lodash.isNil(accountId)) { 

          try { 

           deferred.resolve(restangular.one('user') 
            .one('contactimages') 
            .get({ 'mappedRelatedContactsPath': $scope.mappedRelatedContactsPath, "account": accountId })); 

          } 
          catch (err) { 
           $scope.contactsPopulated = false; 
           deferred.reject(err); 
          } 
         } 
         deferred.promise.then(function (response) { 
          var tests = response; 
          return $q.when(); 
         }, 
         function() { 
          console.log("1st reject"); 
          return $q.reject(); 
         }); 
         return deferred.promise; 

        };