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

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
Есть функция "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()
Может кто-нинбудь знает, как переделать в синхронный или еще как-нибудь, чтобы функция дожидалась результата?
 
Последнее редактирование:
Решил... решение такое:
в функции пишем:
Код:
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
    }
   
} )
 
Назад
Сверху