Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JavaScript .then() (https://javascript.ru/forum/misc/30194-javascript-then.html)

LaNaite 27.07.2012 13:48

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

vadim5june 27.07.2012 16:18

асинхронные функции в отличие от синхронных не возвращают значение с помощью return;
Вам надо из function (res){
вызвать функцию обработчик передав в качестве параметра returnResult
примерно вот так
if (myCollection.getLength() == 0) {returnResult = false} else {returnResult = true};callback(returnResult)

LaNaite 27.07.2012 16:54

Вадим, Спасибо!
Подскажите, пожалуйста, как передать callback-функцию в запрос. Если не сложно - на моем примере.

vadim5june 27.07.2012 17:05

Цитата:

Сообщение от LaNaite (Сообщение 192111)
Вадим, Спасибо!
Подскажите, пожалуйста, как передать 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)};

LaNaite 27.07.2012 17:36

Спасибо! Все получилось)

LaNaite 28.07.2012 22:37

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

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

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

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

То несмотря на использование callback-функции getResult() вернет undefined. Есть какие-нибудь "обходы" асинхронности?

melky 28.07.2012 22:42

Цитата:

Сообщение от LaNaite
Есть какие-нибудь "обходы" асинхронности?

это не карты яндекса, но из той же басни.
http://javascript.ru/forum/174893-post67.html

т.е. только через указание callback, в котором можно будет использовать результаты геокодирования.

vadim5june 28.07.2012 22:55

Цитата:

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

Так из за чего асинхронность потому что сам поцесс получения геокодирования длительный асинхронный-там запрос на сервер идет и функция callback выполняется значительно позже(на десятки миллисекунд) чем Ваша функция getResult
поэтому getResult всегда вернет undefined
Обойти нельзя-по крайней мере это мое мнение
а что Вы не работаете с callback функцией-ее Вы можете задать в любом месте и любого вида-
Ps прочтите так же по ссылке melky то же самое работать через callback функцию

LaNaite 28.07.2012 23:36

Ох, жесть)) я с 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);

melky 28.07.2012 23:51

Цитата:

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

и фиг с ним.

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


Часовой пояс GMT +3, время: 22:48.