Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.07.2012, 13:48
Интересующийся
Отправить личное сообщение для LaNaite Посмотреть профиль Найти все сообщения от LaNaite
 
Регистрация: 27.07.2012
Сообщений: 13

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()
Может я не в том месте присваивание прописываю или возврат?

Последний раз редактировалось LaNaite, 27.07.2012 в 13:52. Причина: дополнение
Ответить с цитированием
  #2 (permalink)  
Старый 27.07.2012, 16:18
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

асинхронные функции в отличие от синхронных не возвращают значение с помощью return;
Вам надо из function (res){
вызвать функцию обработчик передав в качестве параметра returnResult
примерно вот так
if (myCollection.getLength() == 0) {returnResult = false} else {returnResult = true};callback(returnResult)
Ответить с цитированием
  #3 (permalink)  
Старый 27.07.2012, 16:54
Интересующийся
Отправить личное сообщение для LaNaite Посмотреть профиль Найти все сообщения от LaNaite
 
Регистрация: 27.07.2012
Сообщений: 13

Вадим, Спасибо!
Подскажите, пожалуйста, как передать callback-функцию в запрос. Если не сложно - на моем примере.
Ответить с цитированием
  #4 (permalink)  
Старый 27.07.2012, 17:05
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от LaNaite Посмотреть сообщение
Вадим, Спасибо!
Подскажите, пожалуйста, как передать callback-функцию в запрос. Если не сложно - на моем примере.
мне непонятно зачем Вы returnResult передаете в качесиве аргумента-логично было бы так написать
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)};
Ответить с цитированием
  #5 (permalink)  
Старый 27.07.2012, 17:36
Интересующийся
Отправить личное сообщение для LaNaite Посмотреть профиль Найти все сообщения от LaNaite
 
Регистрация: 27.07.2012
Сообщений: 13

Спасибо! Все получилось)
Ответить с цитированием
  #6 (permalink)  
Старый 28.07.2012, 22:37
Интересующийся
Отправить личное сообщение для LaNaite Посмотреть профиль Найти все сообщения от LaNaite
 
Регистрация: 27.07.2012
Сообщений: 13

Вадим, и снова здравствуйте)
Возникла необходимость в продолжении.

Мне нужно организовать обращение к некоторой функции, которая будет вызывать результат геокодирования (не асинхронно).

Если я напишу:

function getResult(){
var result;
findPlacemarkOnMap(adress, result);
return result;
}

То несмотря на использование callback-функции getResult() вернет undefined. Есть какие-нибудь "обходы" асинхронности?
Ответить с цитированием
  #7 (permalink)  
Старый 28.07.2012, 22:42
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от LaNaite
Есть какие-нибудь "обходы" асинхронности?
это не карты яндекса, но из той же басни.
ЧаВО - часто задаваемые вопросы (faq)

т.е. только через указание callback, в котором можно будет использовать результаты геокодирования.
Ответить с цитированием
  #8 (permalink)  
Старый 28.07.2012, 22:55
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от LaNaite Посмотреть сообщение
Мне нужно организовать обращение к некоторой функции, которая будет вызывать результат геокодирования (не асинхронно).
Так из за чего асинхронность потому что сам поцесс получения геокодирования длительный асинхронный-там запрос на сервер идет и функция callback выполняется значительно позже(на десятки миллисекунд) чем Ваша функция getResult
поэтому getResult всегда вернет undefined
Обойти нельзя-по крайней мере это мое мнение
а что Вы не работаете с callback функцией-ее Вы можете задать в любом месте и любого вида-
Ps прочтите так же по ссылке melky то же самое работать через callback функцию
Ответить с цитированием
  #9 (permalink)  
Старый 28.07.2012, 23:36
Интересующийся
Отправить личное сообщение для LaNaite Посмотреть профиль Найти все сообщения от LaNaite
 
Регистрация: 27.07.2012
Сообщений: 13

Ох, жесть)) я с 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);
Ответить с цитированием
  #10 (permalink)  
Старый 28.07.2012, 23:51
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от LaNaite
Ох, жесть)) я с ajax вообще не знаю как работать.
и фиг с ним.

разжую : в сделать задуманное не получится, использовать результат придётся не из return'а, а из функции-callback'a.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript на Яндекс.Фотки - почему тормозит браузеры? ZavFirefox Javascript под браузер 23 27.09.2009 19:24