Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2013, 19:57   #21
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Никак, забудьте про синхронные вызовы. $.get возвращает управление сразу (иначе браузер бы висел во время запроса), success будет вызвана позже, после получения результата. Или не будет, если произошла ошибка.

Участок кода, который должен работать с ansv, заверните в функцию, вызывайте её внутри колбека success.
И что мне это даст? я получу результат внутри этой функции success, а использовать полученные данные не смогу ни в одной другой функции?
Glowworm вне форума Ответить с цитированием
Старый 08.05.2013, 16:03   #22
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Это даст возможность определить момент, когда уже есть что использовать. В этот момент данные можно сохранить в глобальном пространстве имён, в пространстве имён объекта и т.д.
Код, обращающийся к сохранённым данным, должен учитывать возможность того, что данных ещё нет. Либо иметь только одну точку входа, которая дёргается в обработчике success.

В десктопном приложении ткнули на кнопку, появился прогресс-бар или курсор превратился в часы, приложение недоступно пока функция не вернёт управление. Если нужна асинхронность - её придётся реализовывать самому потоками, циклами или ещё как-то. В вэбе ткнули на кнопку, управление вернулось тут же, запрос идёт в фоновом режиме. Всё остальное работает как работало - меню выпадает при наведении, кнопки нажимаются, анимации анимируются...

Можно использовать jQuery.ajax() с параметром async=False, тогда запрос остановит выполнение остального JS-кода (фактически "повесит" активную вкладку браузера) до тех пор, пока сервер не вернёт данные, но я категорически не советую так делать. Это противоречит принципам программирования на JS, кроме того, отмечено как устаревшая возможность и может быть удалено в следующих версиях jQuery.
пыщь
JTG вне форума Ответить с цитированием
Старый 09.05.2013, 11:21   #23
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Это даст возможность определить момент, когда уже есть что использовать. В этот момент данные можно сохранить в глобальном пространстве имён, в пространстве имён объекта и т.д.
Код, обращающийся к сохранённым данным, должен учитывать возможность того, что данных ещё нет. Либо иметь только одну точку входа, которая дёргается в обработчике success.

В десктопном приложении ткнули на кнопку, появился прогресс-бар или курсор превратился в часы, приложение недоступно пока функция не вернёт управление. Если нужна асинхронность - её придётся реализовывать самому потоками, циклами или ещё как-то. В вэбе ткнули на кнопку, управление вернулось тут же, запрос идёт в фоновом режиме. Всё остальное работает как работало - меню выпадает при наведении, кнопки нажимаются, анимации анимируются...

Можно использовать jQuery.ajax() с параметром async=False, тогда запрос остановит выполнение остального JS-кода (фактически "повесит" активную вкладку браузера) до тех пор, пока сервер не вернёт данные, но я категорически не советую так делать. Это противоречит принципам программирования на JS, кроме того, отмечено как устаревшая возможность и может быть удалено в следующих версиях jQuery.
Посмотрите, почему я не могу сохранить полученные данные в глобальную переменную hg?
Код:
<!doctype html>
<html>
<head>
<title>Геокодирование</title>
</head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
var hg;
function to(a,b,callback){
var data = { lat:a, format:"json", lon:b };
$.get( "http://open.mapquestapi.com/nominatim/v1/reverse.php", data, function(geocodData){
    callback(geocodData.display_name); 
}, "json" );
}

 function checkArgs () {
    var c;
var a =54.97916000000001;
var b =39.00051000000008;
to(a,b,function(here){  hg=here;})
alert(hg);

}
</script>
</head>
<body>
<button id="getGeocod" onclick="checkArgs()">Геокодирование</button>
</body>
</html>
Glowworm вне форума Ответить с цитированием
Старый 13.05.2013, 13:32   #24
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Они сохраняются, но чуть позже, блин! http://jsfiddle.net/VJqtd/
пыщь
JTG вне форума Ответить с цитированием
Старый 13.05.2013, 23:36   #25
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

Собственно я так и делала,и теперь понятно, что за пределами этой функции результата не получу.
Glowworm вне форума Ответить с цитированием
Старый 14.05.2013, 08:17   #26
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Получите, если будете сохранять последовательность действий. Переменная hg еще не определена на момент, когда используется. Значение в ней появляется после того, как приходит ответ с сервера. Если вызвать некую функцию внутри checkArgs после прихода ответа с сервера (неважно, кликом или в конце колбэка), то переменная будет иметь значение.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 29.05.2013, 00:03   #27
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

Почему запрос не выполняется в EI, при нажатии на кнопку никакой реакции?
Код HTML:
<!doctype html>
<html lang="ru">
<head>
<title>Прогноз погоды</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
$( function() {
$('#getGeocod').click( function() {
var data = { lat:"51 .521435", lon:"-0.162714", format:"json" };
$.get( "http://open.mapquestapi.com/nominatim/v1/reverse.php", data, success );
} );
function success( geocodData ) {
var geocod = geocodData.place_id + " страна " + geocodData.lat;
alert( geocod );
}
} );
</script>
</head>
<body>
<button id="getGeocod">Геокодирование</button>
</body>
</html>
Glowworm вне форума Ответить с цитированием
Старый 29.05.2013, 20:39   #28
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

А потому что IE<9 не поддерживает http://ru.wikipedia.org/wiki/Cross-o...source_sharing. Вот и вернулись к JSONP Доки на http://open.mapquestapi.com/nominatim/ подсказывают, что сервер умеет отдавать JSONP, для этого имя функции надо передать в параметре json_callback и заменить $.get на более настраиваемый $.ajax с соответствующим типом данных.

Код:
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Прогноз погоды</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
$(function() {

  $('#getGeocod').click(function() {

    var jsonpCallbackName = "blabla12345";

    var data = {
      lat: "51 .521435",
      lon: "-0.162714",
      format: "json",
      json_callback: jsonpCallbackName,     
    };

    $.ajax({
            url: 'http://open.mapquestapi.com/nominatim/v1/reverse.php',                    
            type: 'get',
            dataType: 'jsonp',
            jsonpCallback: jsonpCallbackName,
            data: data,
            success: success
        }).fail(function(event, jqxhr, exception) { 
      alert(jqxhr + ': ' + exception);
      });
  });

  function success(geocodData) {
    var geocod = geocodData.place_id + " страна " + geocodData.lat;
    alert(geocod);
  }
});
</script>
</head>
<body>
<button id="getGeocod">Геокодирование</button>
</body>
</html>


Когда jQuery.ajax видит dataType: 'jsonp', он прозрачно для пользователя создаёт функцию blabla12345(), потом тег <script src="http://open.mapquestapi.com/nominatim/v1/reverse.php?....">, а mapquestapi возвращает не JSON, а функцию blabla12345(<JSON а качестве параметра>). Старый IE не умеет принимать данные с других доменов, но может грузить скрипты откуда угодно, такой вот красивый хак.

Код:
// Было
{
	"place_id": "91363621",
	"licence": "Data \u00a9 OpenStreetMap ...
}

// Стало
blabla12345({
	"place_id": "91363621",
	"licence": "Data \u00a9 OpenStreetMap ...
})
пыщь
JTG вне форума Ответить с цитированием
Старый 30.05.2013, 23:33   #29
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

А почему не выполняются несколько запросов в цикле? это как то связано с заданием имени jsonp, говорит, что объект не вызывается с таким именем

Код HTML:
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Прогноз погоды</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
var a = new  Array();
var b = new Array();
function sdr(a,b,callback) {

    var jsonpCallbackName = "tyts";

    var data = {
      lat: a,
      lon: b,
      format: "json",
      json_callback: jsonpCallbackName     
    };

    $.ajax({
            url: 'http://open.mapquestapi.com/nominatim/v1/reverse.php',                    
            type: 'get',
            dataType: 'jsonp',
            jsonpCallback: jsonpCallbackName,
            data: data,
            success: success
        });
 

  function success(geocodData) {
  var geocod = geocodData.display_name;
    var geocod1 = geocodData.address.state;
	callback(geocod,geocod1);
   // alert(geocod);
  }
};

function log(s,s1){
alert(s+s1);};

function ty(){
a [0] =58.19745;
b [0] =57.10400000000004;
 a [1] =50.19745;
b [1] =57.10400000000004;
 a [2] =73.19745;
 b [2] =30.10400000000004;
for(var i=0; i<=2; i++){
sdr(a[i],b[i],function(s,s1){
log(s,s1);})}
};


</script>
</head>
<body>
<button id="getGeocod" onclick="ty()">Геокодирование</button>
</body>
</html>
Glowworm вне форума Ответить с цитированием
Старый 30.05.2013, 23:41   #30
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а зачем тут цикл?
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
КАК ПЕРЕДЕЛАТЬ ФОРМАТ mp4 В ФОРМАТ 3gp,MPEG4 kamalruslan Софт 4 20.08.2015 16:16
C++ JSON qip2005 Visual C++ 2 05.11.2012 19:48
Qt + Json Lindemann66 Qt и кроссплатформенное программирование С/С++ 0 18.08.2011 15:26
Json парсер Carbon Общие вопросы по Java, Java SE, Kotlin 3 02.06.2011 22:59
JSON и C++Builder s2dent Общие вопросы C/C++ 0 15.06.2010 14:46