JavaScript .then()
Всем привет!
Я начинаю изучать yandex.api 2.х для интеграции с 1С. Очень надеюсь здесь найти ответ. В документации к api есть метод geocode() который отвечает за прямое и обратное геокодирование. Из 1С я хочу обращаться к методу geocode и в случае неудачного геокодирования заполнять таблицу адресами, которые не удалось отобразить на карте. Запрос geocode асинхронный. Функционал я пытаюсь реализовать с помощью функции findPlacemarkOnMap(). Код ниже: function findPlacemarkOnMap(adress, returnResult){ var myCollection = new ymaps.GeoObjectCollection(); ymaps.geocode(adress, {results: 1}).then( function (res){ myCollection.add(res.geoObjects); myMap.geoObjects.add(myCollection); if (myCollection.getLength() == 0) {returnResult = false} else {returnResult = true}; }, // Ошибка сервера или "плохие" входные данные // Не срабатывает в случае неотображения объектов на карте function (err){ alert(err.message); }); return returnResult; } Проблема в том, что return returnResult срабатывает раньше, чем выполняется код в конструкции .then() Может я не в том месте присваивание прописываю или возврат? |
асинхронные функции в отличие от синхронных не возвращают значение с помощью return;
Вам надо из function (res){ вызвать функцию обработчик передав в качестве параметра returnResult примерно вот так if (myCollection.getLength() == 0) {returnResult = false} else {returnResult = true};callback(returnResult) |
Вадим, Спасибо!
Подскажите, пожалуйста, как передать callback-функцию в запрос. Если не сложно - на моем примере. |
Цитата:
function findPlacemarkOnMap(adress,callback){ ....... var returnResult; if (myCollection.getLength() == 0) {returnResult = false} else {returnResult = true};callback(returnResult);}, function (err){ alert(err.message); }); }; function callback(r){alert(r)}; |
Спасибо! Все получилось)
|
Вадим, и снова здравствуйте)
Возникла необходимость в продолжении. Мне нужно организовать обращение к некоторой функции, которая будет вызывать результат геокодирования (не асинхронно). Если я напишу: function getResult(){ var result; findPlacemarkOnMap(adress, result); return result; } То несмотря на использование callback-функции getResult() вернет undefined. Есть какие-нибудь "обходы" асинхронности? |
Цитата:
http://javascript.ru/forum/174893-post67.html т.е. только через указание callback, в котором можно будет использовать результаты геокодирования. |
Цитата:
поэтому getResult всегда вернет undefined Обойти нельзя-по крайней мере это мое мнение а что Вы не работаете с callback функцией-ее Вы можете задать в любом месте и любого вида- Ps прочтите так же по ссылке melky то же самое работать через callback функцию |
Ох, жесть)) я с ajax вообще не знаю как работать.
Я поняла, что в примере с сайта надо изменить Параметр async на false. Но что находится в url, и где надо указать мою функцию findPlacemarkOnMap() (и нужно ли в этом случае передавать в нее Callback)? Прошу прощения, если задаю смешные вопрос, я не спец в этом, пытаюсь разбираться. function req(){ return $.ajax({ async: false; url: '/foo.php', method: 'GET', success: function(data){ return data; } }); } var myData = req(); alert(myData); |
Цитата:
разжую : в сделать задуманное не получится, использовать результат придётся не из return'а, а из функции-callback'a. |
Цитата:
Поэтому с аяксом не разбирайтесь У вас есть какая то функция куда Вы хотите передать результат callback-так сделайте callback -ом всю вашу функцию |
т.е. если я обращаюсь к запросу js из стороннего приложения, то получить его результат (на сторону приложения) - не получится?
|
не могу. обрабатываться результат должен не в js, а в стороннем приложении (1с)
|
Цитата:
|
отсрочить - эт как?)
|
Цитата:
Если можно так чтобы сначала обратится к геолокации записать результат куда то а потом уже передать в 1С или периодически обращайтесь к геолокации каждую секунду результат записывайте в переменную а 1С когда обратится возьмет последнее значение |
Можно.
Например в глобальную переменную? Я сейчас сделала так, что в callback функции происходит изменение глобальной переменной на результат, который она получила в findPlacemarkOnMap(). И я создала новую функцию, которая возвращает глобальную переменную: function getGlobalResult(){ alert(returnResult); //return returnResult; } Из 1С я поочереди вызываю сначала: findPlacemarkOnMap, затем getGlobalResult. Все равно Undefined |
Попробую и я обьяснить почему так, т.е. суть асинхронности.
Выполняется код, выполняется, выполняется, выполняется по порядку, тут раз - и асинхроннный запрос запросил что-то от сервера, сервер думает, а код выполняется дальше по порядку, сервер думает, а код выполняется дальше, сервер думает, а код выполняется дальше, внезапно сервер законцил думать и вернул результат, в связи с чем была вызвана функция callback прямо во время выполнения какой-то другой части кода. выпоненен callback(), код выполняется дальше, код выполняется дальше... Или даже так(в вашем случае): Выполняется код, выполняется, выполняется, выполняется по порядку, тут раз - и асинхроннный запрос запросил что-то от сервера, сервер думает, а код выполняется дальше по порядку, сервер думает, а оставшийся код уже полностью выполнен и ничего не происходиит, сервер думает, ничего более не происходиит, внезапно сервер законцил думать и вернул результат, в связи с чем была вызвана функция callback. выпоненен callback(), ничего более не происходиит... Т.о. вы вызываете функцию когда сервер ещё не закончил думать. Естесно переменная ещё undefined. В яндексе работают умные ребята, там должны быть функции для таких случаев. Накрайняк обращаться к переменной с интервалом до тех пор пока там не появитсчся значение. |
Спасибо. Я это понимаю. Сейчас пытаюсь понять - есть ли какие-то методы - позволяющие реализовать мою задачу. Если бы я писала код для интернет-сервиса - проблем бы не было. Но я использую передачу параметров.
|
Цитата:
и Вам нужен результат геолокаци с этим адресом нужно общение с 1С тоже асинхронным сделать-сначала он передат Вам adress в одну функцию а потом когда у Вас будет результат Вы передадите в 1С его |
Повесила геокодирование и получение результатов геокодирования на разные кнопки. Неудобно конечно... но работает(
|
Цитата:
Что такое adress Что за программа бухгалтерская или битрикс-и зачем там геолокация Почему нельзя оттуда отправить асинхронный запрос? |
Часовой пояс GMT +3, время: 20:08. |