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. |
Часовой пояс GMT +3, время: 22:48. |