2017-03-09 1 views
0

Ich habe einen Service, der die Daten von der API holt. Wenn ich versuche, diesen Service anzurufen. Es kommt mit demselben Wert zurück.defer.promise gibt dasselbe Ergebnis in angularJS zurück

appName.service('FetchCustomerDate', ['$http', '$q', function($http, $q) { 
    var self = this; 
    self.getCustomerData = function(token,name) { 
     var deferred = $q.defer(); 
     return $http({ 
      method: 'GET', 
      url: , 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }).then(function(response) { 
      deferred.resolve(response); 
      return deferred.promise; 
     }, function(response) { 
      deferred.reject(response); 
      return deferred.promise; 
     }); 
    }; 
}]); 
+3

Was bedeutet „gleiche Wert“ bedeuten? Im Augenblick tun die Zeilen "return secreted.promise" nichts; gib einfach die Versprechen '$ http' zurück. Keine Notwendigkeit für die aufgeschobenen. –

+0

Haben Sie versucht, die Zeile 'return deferred.promise;' außerhalb der Erfolgs- und Fehlerfunktionen von '.then()' zu setzen? –

+0

@MikeMcCaughan gleicher Wert bedeutet, dass die API-Antwort die gleiche ist wie der vorherige API-Aufruf. – Player

Antwort

0

Ich sehe ein wenig Verwirrung hier. Lassen Sie uns versuchen, es zu löschen. Wenn Sie aufgeschobene Objekt verwenden möchten, müssen Sie den Code ein wenig ändern:

appName.service('FetchCustomerDate', ['$http', '$q', function ($http, $q) { 
    var self = this; 
    self.getCustomerData = function (token, name) { 
     var deferred = $q.defer(); 
     $http({ // Do not return here, you need to return the deferred.promise 
      method: 'GET', 
      url: '...some URL here...', 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }).then(function (response) { 
      deferred.resolve(response); // It's correct, you are resolving the deferred promise here. 
      // return deferred.promise; // You do not need to return the deferred.promise here. 
     }, function (response) { 
      deferred.reject(response); // It's correct, you are rejecting the deferred promise here. 
      // return deferred.promise; // You do not need to return the deferred.promise here. 
     }); 

     return deferred.promise; // The function must return the deferred.promise 
    }; 
}]); 

Im Detail Funktion getCustomerData muss das Versprechen Rückkehr mit return deferred.promise-deferred Objekt gehören. Innerhalb then() Callback Sie einfach lösen oder deferred Versprechen abzulehnen. Sie müssen die deferred.promise nicht zurückgeben.

Sie können den Code verbessern. Der $http Dienst gibt eine Zusage zurück, und der Wert, der von then Rückrufe zurückgegeben wird, wird von then Methode in einem Versprechen verpackt. Zu wissen, dass Sie die Verwendung von deferred Objekt entfernen:

appName.service('FetchCustomerDate', ['$http', function ($http) { 
    var self = this; 
    self.getCustomerData = function (token, name) { 
     return $http({ // Here, you need to return the promise returned by $http. Than promise will contain the response returned inside "then" callbacks. 
      method: 'GET', 
      url: '...some URL here...', 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }).then(function (response) { 
      return response; // Simply return the response, it will be wrapped in a resolved promise by "then()" 
     }, function (response) { 
      return response; // Simply return the response, it will be wrapped in a rejected promise by "then()" 
     }); 
    }; 
}]); 

Wie Sie sehen können, die 2 then Rückrufe gibt einfach den response Objekt, aus diesem Grund können Sie sie weglassen:

appName.service('FetchCustomerDate', ['$http', function ($http) { 
    var self = this; 
    self.getCustomerData = function (token, name) { 
     return $http({ // Here, you need to return the promise returned by $http. Than promise will contain the response form the GET call 
      method: 'GET', 
      url: '...some URL here...', 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }); 
    }; 
}]); 
+0

Vielen Dank – Player

0

Gewöhnlich Wenn Sie Daten mit dem Dienst $http abrufen, möchten Sie Daten aus der Antwort abrufen und sie zum Beispiel auf $scope auswirken oder sie irgendwie verarbeiten. Was versuchst du zu machen? Bitte klären Sie Ihre Frage.

Normalerweise wird ein Abruf wird in etwa so aussehen:

appName.service('FetchCustomerDate', ['$http', '$q', function($http, $q) { 
    var self = this; 

    function notifyError(reason) { 
     console.error(reason); 
    } 

    self.getCustomerData = function(token,name) { 
     var deferred = $q.defer(); 
     return $http({ 
      method: 'GET', 
      url: , 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }) 
      .then(function onSuccess(response) { 
      var cfg = response.data; // process data 
     }) 
      .then(function onSuccess(response) { 
      // chained promises 
     }) 
      .then(
      function onSuccess(res) { 
       // ... this will trigger the chain reaction 
       deferred.resolve(res); 
      }, 
      function onFailure(reason) { 
       notifyError(reason); // manage the error 
       deferred.reject(reason); 
      }) 
      ; 
      return deferred.promise; 
     } 
    }]); 
Verwandte Themen