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, время: 08:45. |