2016-11-04 6 views
1

Ich bin mir nicht sicher, wie man das Versprechen zurückgibt. Ich habe versucht, das Ergebnis in einem verschachtelten Verfahren zurückzukehren, aber würde es vorziehen, um das Ergebnis in zwei verschiedenen Methoden zurückzukehren, wie später gezeigt:

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

Bevorzugen Beispiel unten zu beheben:

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

Derzeit I bin immer: „Typeerror: Kann nicht Eigentum‚und dann‘undefinierten lesen“

Dank aller

Antwort

0

Zunächst einmal daran erinnern, über consisten Cy. .. Die isNil wenn macht Ihre Funktion in einigen Fällen nichts zurückkehr (Sie werden TypeError: Cannot read property 'then' of undefined " Fehlermeldung erhalten, wenn accountId nicht vorgesehen ist

Sie haben zwei Möglichkeiten, um Ihr Problem zu lösen

Erster Weg:

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

Der zweite Weg (mit DEFER).

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

Sie sollten offizielle Referenz überprüfen über $q Service: https://docs.angularjs.org/api/ng/service/$q

zahlreiche Beispiele für typische Versprechen Verwendungen Es gibt keine.

+0

für das erste Verfahren hinzugefügt I $ q in meinem Controller aber Fehler bekommen jetzt: Typeerror: $ q ist keine Funktion: .Controller ('SelectUserController' [ '$ scope', 'PubSub', ‚Pnotify ',' Common.InfiniteListService ',' SelectUserService ',' Restangular ',' $ q ', Funktion ($ scope, pubSub, pnotify, InfiniteListService, SelectUserService, restangular, $ q) { –

+0

Das Problem ist, ich möchte ausführen eine Logik mit der Antwort: zB wenn das Versprechen gelöst ist, möchte ich nach zusätzlicher Logik suchen –

+0

Die isNil funktioniert, weil ich die Methode nur aufruft, wenn das Konto nicht null ist. –

0

Dies ist, was ich verwendet habe, um den Wert zurückzugeben und eine zusätzliche Methode hinzuzufügen, um mit der Antwort umzugehen.

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

        }; 
Verwandte Themen