wolf47
@wolf47
Айтишник, немного програмирую на JS

Как получить результат из асинхронного запроса?

Добрый день, Друзья!

У меня эта задача всегда превращается в проблему. У меня input, при вводе я хочу показывать в выпадющем списке данные из двух источников. Первый источник берется у меня из базы, второй источник это адреса из яндекс карт (Yandex autocomplete).

Я написал код который берет текс и ищет из двух источников. С первым источником никаких проблем нет, а второй это запрос на яндекс карты. Тут есть пример который вызывает angular http и возвращает массив. Вот он:
<h4>Asynchronous results</h4>
    <pre>Model: {{asyncSelected | json}}</pre>
    <input type="text" ng-model="asyncSelected" placeholder="Locations loaded via $http" uib-typeahead="address for address in getLocation($viewValue)" typeahead-loading="loadingLocations" typeahead-no-results="noResults" class="form-control">
    <i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>
    <div ng-show="noResults">
      <i class="glyphicon glyphicon-remove"></i> No Results Found
    </div>

// Any function returning a promise object can be used to load values asynchronously
  $scope.getLocation = function(val) {
    return $http.get('//maps.googleapis.com/maps/api/geocode/json', {
      params: {
        address: val,
        sensor: false
      }
    }).then(function(response){
      return response.data.results.map(function(item){
        return item.formatted_address;
      });
    });
  };


В первый раз я сделал точно также, но в результат я получал не просто массив а промис, а сам массив был уже внутри нее.

В итоге я написал следующий код, который все таки возвращает пустой массив. В логах видно что с начало возвращается пустой массив, а только после этого вызывается функция getLocations.

$scope.getTarifZones = function(val) {
            var result = [];
            var getLocations = function(value) {
                return $http.get('/api/locations', {
                  params: {
                    address: 'Казахстан, Алматы, '+value
                  }
                }).then(function(response){
                    var featureMember = response.data.response.GeoObjectCollection.featureMember;
                    featureMember.map(function(item){
                        return {
                            place: item.GeoObject.name,
                            type: 'Адреса'
                        };
                    });

                    var zones =  _.filter($scope.order.client.places, function (place) {
                        return place.place.address.indexOf(val) >=0;
                    }).map(function (place) {
                        place.place.type = 'Тарифные зоны';
                        return place;
                    }); 
                    result = _.concat(zones, featureMember);

                    console.log('locations ', result);
                });
            };
            getLocations(val);
            return result;
        };
  • Вопрос задан
  • 585 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы