2016-08-19 4 views
0

Ich habe Angular Service geschrieben, wie unten gezeigt.Bevor das Versprechen auf Service-Methode gelöst wird, geht es zu der Hauptversprechen der Methode

getPropertyDetailsByUsingApiService.js

(function() { 
    appModule.service('getPropertyDetailsByUsingApiService', ['$http', function ($http) { 
     this.propertyDetails = function (token, number, street, county, zip) { 
      var endpointUrl = 'http://my.com/api/Matcher?Token='; 
      var url = endpointUrl + token + '&Number=' + number + '&Street=' + street + '&County=' + county + '&Zip=' + zip; 

      return $http.get(url).then(function (data) { 
       var result = data; 
       if (result.data[0].Status == 'OK') { 
        $http.get(endpointUrl + token + '&Krp=' + result.data[0].Result[0].KRP + '&County=' + county) 
         .then(function (finalData) { 
          return finalData; 
         }); 
       } 
      }); 
     }; 
    } 
    ]); 
})(); 

Dies ist die aufwändige Methode:

propertyForm.js

//to call Api 
    vm.callApi = function() { 
     var county = _.find(vm.counties, function (c) { return c.id == vm.property.countyId; }); 
     var city = _.find(vm.cities, function (c) { return c.id == vm.property.address.cityId; }); 

getPropertyDetailsByUsingApiService.propertyDetails(vm.getMd5Hashbytes(), vm.property.address.streetNumber, vm.property.address.streetName, 
     county.name, city.zipCode).then(function (result) { 
        vm.propertyDetails = result; 
       }); 
     }; 

Q: Problem hier ist vor der Auflösung der Versprechen auf Service-Methode, es geht um die Hauptversprechen der Methode.Mit anderen Worten vor der zweiten Versprechen auf der Service-Methode, wo es an die Versprechen der anrufenden Methode geht.Kann sagen Sie mir, wo ist Das Thema ?

Antwort

1

können Sie umschreiben:

return $http.get('url').then(function(r) => { return r;}) 

als:

var defer = $q.defer(); 

$http.get('url').then(function(r) => { defer.resolve(r);}) 

return defer.promise; 

Es macht keinen Sinn in gewöhnlichen Fall machen, aber in besonderen Fällen können Sie tun, was auch immer mit dieser Konstruktion:

var defer = $q.defer(); 
if (smth) { 
    defer.resolve('test1'); 
} else { 
    $http.get('url').then(function(r) => { 
     if (smth2) { 
      defer.resolve(r); 
     } else { 
      $http.get(..., function(r) => { 
       defer.resolve(r); 
      }) 
     } 
    }) 
| 

return defer.promise; 
+0

Ich versuche Ihre Lösung und werde Sie wissen lassen. Aber können Sie mir sagen, warum meine Implementierung nicht funktioniert? Vielen Dank. – Sampath

+0

Cheers .... Es funktioniert mein Freund.Vielen Dank. Hoffe, Sie geben ein Feedback zu oben genannten Frage, wenn Sie wiederkommen werden. Haben Sie einen schönen Tag für Sie :) – Sampath

1

Also, in der ersten Versprechen auf den Service, sind Sie nicht das zweite Versprechen, so dass das erste Versprechen gerade beendet und beendet, wenn die Methode abgeschlossen ist, und wartet nicht auf das zweite Versprechen.

return $http.get(url).then(function (data) { 
       var result = data; 
       if (result.data[0].Status == 'OK') { 
        //Add a return here 
        return $http.get(endpointUrl + token + '&Krp=' + result.data[0].Result[0].KRP + '&County=' + county) 
         .then(function (finalData) { 
          return finalData; 
         }); 
       } 
      }); 
+1

Ja, Ihre Lösung funktioniert auch . Aber ein bisschen spät.Anyway vielen Dank. Jetzt habe ich 2 Optionen. Cheers :) – Sampath

Verwandte Themen