2016-11-04 174 views
1

我不知道如何去回覆承諾。我試圖在嵌套方法返回的結果,但更願意返回結果有兩種不同的方法如圖所示算賬:

$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   
    } 

目前我我越來越:「類型錯誤:無法讀取屬性‘然後’未定義 的」

感謝所有

回答

0

首先,記得consisten CY。 。該isNil如果讓你的函數不是在某些情況下返回任何東西時,不提供accountId(你會得到TypeError: Cannot read property 'then' of undefined "錯誤

有兩種方法來解決你的問題

第一種方式:

$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在我的控制器,但現在收到錯誤:類型錯誤:$ q是不是一個函數:.controller( 'SelectUserController',[ '$範圍', 'PubSub的',「Pnotify ','Common.InfiniteListService','SelectUserService','Restangular','$ q', 函數($ scope,pubSub,pnotify,InfiniteListService,selectUserService,restangular,$ q){ –

+0

問題是我想要執行一些邏輯與響應:例如;當承諾被解決時,我想檢查額外的邏輯。 –

+0

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; 

        };