Клуб API Карт

(API 2.0) двойной geocode в функции и promise, помогите оптимизировать...

AntiMandron
10 июня 2014, 08:25

Здрасте!

При вызове функции, она отправляет 2 запроса на геокодер:

1) "Смоленск, " + улица

2) Искать улица в квадрате от центра

Если первый запрос, вернул координаты цента, то беру данные из второго. Например, если в Смоленске будем искать улицу Шевченко, то сработает данные из первого запроса верные, а если Уколово, то это за пределами города и корректные данные вернет второй запрос.

 

Проблема в том, что геокодер возвращает результат не сразу, а спустя какое-то время, поэтому сначала сделал так, отправляю сразу два запроса, через таймаут сравниваю значения. Но я так понял можно оптимизировать функцию использую Promise, т.е.

 

var pointcoords = center;
var promise = new ymaps.util.Promise();
promise.then(
    function (pointcoords) {
        console.log("поиск по строке");
        // поиск по строке 
        ymaps.geocode("Смоленск, " + street, {
            results: 1
        }).then(function (res) {
            if (res.geoObjects.getLength()) {
                var point = res.geoObjects.get(0);
                pointcoords = point.geometry.getCoordinates();
            }
        });
        return pointcoords;
    }).then(function (pointcoords) {
    // при необходимости делаем второй запрос
    if (pointcoords[0] == center[0] && pointcoords[1] == center[1]) {
        console.log("поиск в квадрате");
        // точки для области 
        var p1 = ymaps.coordSystem.geo.solveDirectProblem(center, dir1, 10000).endPoint;
        var p2 = ymaps.coordSystem.geo.solveDirectProblem(center, dir2, 10000).endPoint;
        ymaps.geocode(street, {
            boundedBy: [p1, p2],
            results: 1,
            strictBounds: true
        }).then(function (res) {
            if (res.geoObjects.getLength()) {
                var point = res.geoObjects.get(0);
                pointcoords = point.geometry.getCoordinates();
            }
        });
    }
});
promise.resolve(pointcoords);

 

почему-то promise не отрабатывает первый запрос, подозрение, что из-за задержки ответа геокодера, первый запрос возвращает координаты центра вместо искомых... может ли promise избавить от использования settimeout()

3 комментария
Подписаться на комментарии к посту

разобрался, promise.resolve

Я вам в другом посте уже давал ссылку на реализацию двух последовательных запросов к геокодеру в интерфейсе своего провайдера.

 

В вашем коде сейчас написана ерунда.

Вы содаете промис и резолвите его синхронно координатами (зачем?)

Затем в первом обработчике вы резолвите его теми же координатами, потому что ваш "return pointcoords;" отработает синхронно, а "pointcoords = point.geometry.getCoordinates();" отработает асинхронно (после ответа геокодера)

 

Создайте одну функцию возвращающую промис, и делайте ему resolve, когда оба геокодера (или один) отработают.

И лучше все-таки потратить 20 минут на чтение спецификации промисов, а то так и будете ходить наощупь.

И рекомендую использовать АПИ 2.1 там промисы поддерживают стандарт А+ (используется библиотека vow) и там ваша задача решается проще, а в 2.0 они сильно урезанные 

спасибо, уже сделал как надо, просто недопонял вначале