2016-08-19 51 views
0

我已經編寫了如下所示的Angular Service。在解決服務方法的承諾之前,它轉到主要方法的承諾

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; 
         }); 
       } 
      }); 
     }; 
    } 
    ]); 
})(); 

這是耗時的方法:

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

問題:這裏的問題是在解決服務方法的承諾之前,它轉到主要方法的承諾。換句話說,在解決服務方法的第二個承諾之前,它涉及調用方法的承諾。可以告訴我在哪裏問題 ?

回答

1

可以重寫:

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

爲:

var defer = $q.defer(); 

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

return defer.promise; 

它沒有在通常情況下意義,但在特殊情況下,你可以做任何與這種結構:

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

我會試試你的解決方案,並會讓你知道。但是你能告訴我爲什麼我的實現不起作用嗎?謝謝。 – Sampath

+0

乾杯....它正在工作我的朋友。非常感謝你。希望你會回答上述問題,當你再次回來。對你有一個美好的一天:) – Sampath

1

所以,在服務的第一個承諾中,你並沒有返回第二個承諾,所以第一個承諾就完成了並在方法完成時解決,而不等待第二個承諾。

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

是的,你的解決方案也工作但有點遲了。總之謝謝lot.Now我有2個選項。乾杯:) – Sampath