Функция делает return раньше, чем действия (ассинхронность Яндекс.карты)?

Тема в разделе "JavaScript", создана пользователем danneo, 15 фев 2014.

Модераторы: ZiX
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    Есть функция "default_myPlacemark", которая проверяет поле на наличие координат. Если нет, то берет адрес и получает координаты. Далее записывает их в поле и должна вернуть после этого true.
    Эта функция срабатывает по нажатию на ссылку, вызывается так: if ( ! default_myPlacemark() ) {...}
    * Получается некая валидация...
    Вот она то и возвращает неверное значение.
    Есть переменная err_val. Она задается в начале функции, как false.
    И эта функция делает return err_val; раньше, чем выполнятся все действия внутри функции, не успев присвоить переменной err_val = true.
    В функции есть if-else. Пробовал return ставить не в конце функции, а в конце if и else. Т.е. в if делаю return false, в else делаю return true. Один фиг - возвращается то значение, которое было укзано до функции.


    Если вызываю функция так:
    Код:
    var res_fun = default_myPlacemark();
                if ( ! res_fun ){
                    -код-
                    console.log( res_fun );
                }
    Пишет undefined, хотя функция выполняет свои действия...

    Надеюсь понятно изложил? :)
    Почему return срабатывает раньше? вроде как не должно же быть так... уже 3-е сутки голову гружу... кода кучу переписать успел...
    P.s. функцию не выкладываю, т.к. очень большая, примерно 200 строк :)

    -------------------
    Проблема нашлась - ассинхронный вызов ymaps.geocode()
    Может кто-нинбудь знает, как переделать в синхронный или еще как-нибудь, чтобы функция дожидалась результата?
     
    Последнее редактирование: 15 фев 2014
    droit74 нравится это.
  2. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    Решил... решение такое:
    в функции пишем:
    Код:
    var promise = new ymaps.util.Promise();
    далее, когда нужно что-то определить для возврата результата функции, пишем это через это:
    Код:
    promise.resolve( тут значения, которые нужно вернуть в случае удачной работы ф-ии);
    и/или
    Код:
    promise.reject("все очень и очень плохо");
    в конце функции делаем возврат:
    Код:
    return promise ;
    А чтобы вызвать эту функции, нужно:
    Код:
    func_myPlacemark().then(function ( res ){
        //тут работаем с результатом возврата через переменную res. например, я делал так:
        if( ! res ){
            //делаем в случае возврата false
        }
        else if( res ) {
        
            //делаем в случае возврата true
        }
       
    } )