2016-07-22 3 views
3

Я создаю один заводский метод, который всегда возвращает undefined при получении значения из контроллера. когда я пишу журнал, значения меняются отлично, но не заданы.Factory Method всегда возвращает undefined в AngularJs

.factory('GetLatLongFromAddress', ['$http', '$q', function ($http, $q) { 

    var LatnLong = 
     { 
      Latitude: 0.00, 
      Longitude: 0.00 
     } 

    return   { 
      GetLatLong: function (address) { 
       var geocoder = new google.maps.Geocoder(); 
       var address = address; 
       geocoder.geocode({ 'address': address }, function (results, status) { 
        if (status == google.maps.GeocoderStatus.OK) 
        { 
         var latitude = results[0].geometry.location.lat(); 
         var longitude = results[0].geometry.location.lng(); 
         LatnLong.Latitude = latitude; 
         LatnLong.Longitude = longitude; 
         console.log(LatnLong); 
        } 
       }); 
       setTimeout(function() { }, 3000); 
       return LatnLong 
      }, 

     } 

}])

И myController, в котором я зову это;

$scope.returnValue=(JSON.stringify(GetLatLongFromAddress.GetLatLong("Address")));   

Итак, вы можете мне помочь в этом.

Thank you.

+0

Вы ввели его? – Alessio

+0

Можете ли вы помочь мне дать мне больше деталей, потому что я новичок в угловом –

ответ

3

Вы работаете с асинхронным запросом к API Google. Поэтому ответ API не будет получен немедленно. В вашем примере вы отправили запрос API и вернули LatnLong до получения ответа. Вы пытались дождаться ответа с помощью setTimeout, но функция setTimeout не работает так. Существует ваш пример кода с комментариями:

var geocoder = new google.maps.Geocoder(); 
var address = address; 
geocoder.geocode({ 'address': address }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) 
    { 
     // This code will be executed when we receive response from Google API. 
     // It can be in 2, 3 or 6 seconds. 
     // We can't tell for sure how much time it will take. 

     var latitude = results[0].geometry.location.lat(); 
     var longitude = results[0].geometry.location.lng(); 
     LatnLong.Latitude = latitude; 
     LatnLong.Longitude = longitude; 
     console.log(LatnLong); 
    } 
}); 
setTimeout(function() { 
    // This code will be executed in 3 seconds. 
}, 3000); 
return LatnLong // This code will be executed immediately. So LatnLong is undefined. 

При работе с асинхронными запросами, которые необходимо использовать promises Вы можете найти более подробную информацию по следующей ссылке: https://docs.angularjs.org/api/ng/service/ $ д

В вас случае следующий код должен работа:

var deferred = $q.defer(); 
var geocoder = new google.maps.Geocoder(); 
geocoder.geocode({ 'address': address }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) 
    { 
     var latitude = results[0].geometry.location.lat(); 
     var longitude = results[0].geometry.location.lng(); 
     var LatnLong = { 
      Latitude: latitude, 
      Longitude: longitude 
     }; 
     deferred.resolve(LatnLong); 
    } 
}); 
return deferred.promise; 

Этот код будет возвращать обещание, а затем вы можете поместить данные в $ рамки таким образом:

GetLatLongFromAddress.GetLatLong("Address").then(function(LatLong){ 
    $scope.returnValue= JSON.stringify(LatLong); 
}); 
+1

спасибо. отлично работает. :) –

+0

приветствую :) –

1

Вы пробовали без $ timeout? Кстати, почему пустой тайм-аут здесь?

+0

да. Я также пробовал без тайм-аута. я думал, что просто спал всего лишь 2 секунды, в которые возвращаемая переменная получает данные. –

+0

add mean добавить 'GetLatLongFromAddress' к вашему контроллеру: \t Ctrl. $ injection = ['GetLatLongFromAddress']; \t функция Ctrl (GetLatLongFromAddress) {} – DMCISSOKHO

+0

спасибо. Я добавил в свой контроллер defination.ie .controller ('addcompanyController', ['$ scope', '$ http', '$ theme', '$ location', '$ rootScope', '$ routeParams', 'GetLatLongFromAddress', ' функция ($ scope, $ http, $ theme, $ location, $ rootScope, $ routeParams, GetLatLongFromAddress) { –

Смежные вопросы