Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.09.2016, 20:10
Аспирант
Отправить личное сообщение для Sherminator Посмотреть профиль Найти все сообщения от Sherminator
 
Регистрация: 01.08.2012
Сообщений: 50

Вложенные Ajax запросы
Всем доброго времени суток!

Как известно, применение синхронных запросов нежелательно. Но вот что делать, если информацию нужно получить "вложенно". То есть для того, чтобы выдать инфу, нужно сделать последовательные запросы к серверу.

Например (хардкор конечно, но):
var user = {
    country: 1,
    region: 2,
    city: 5
};

Запрос А = запрашиваем пользователя, получаем айди страны, региона, города
Запрос В = запрашиваем страну по айди, получаем айди областей
Запрос С = запрашиваем область по айди, получаем айди городов
Запрос D = запрашиваем город по айди, и получаем наконец название города...

Т.к. используем AJAX (А), то запросы посылаются синхронно с проходом компилятора (К), но К не дожидается пока А вернет что-то. В итоге код вида
var Adress = function(countryId, regionId, cityId){
    var adr = {};
    var gCr = AJAX.getCountries();
    adr.country = gCr[countryId].name;
    var gRg = AJAX.getRegionInCountry(countryId);
    adr.region = gRg[regionId].name;
    var gCt = AJAX.getCityInRegion(regionId);
    adr.city = gCt[cityId].name;
    return adr;
};

var U_adress = new Adress(user.country, user.region, user.city);
var string = "Пользователь проживает по адресу" +  U_adress.country + U_adress.region + U_adress.city;

вообще неуместен, т.к на выходе по понятным причинам получим Польз. пр. по адресу undefined undefined undefined.

При использовании колбеков, которые как раз таки применяются для такого
AJAX.getCountries(function () {
    ///...
    var gRg = AJAX.getRegionInCountry(countryId, function () {
        ///...
        var gCt = AJAX.getCityInRegion(regionId, function () {
            ///...
        })
    })
});

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

Вопрос, уважаемые знатоки: Как заставить этот AJAX сделать вложенные (последовательныe) запросы, когда для одного запроса нужно сделать сначала другой, а для другого сначала третий и т.д ?
Ответить с цитированием
  #2 (permalink)  
Старый 29.09.2016, 20:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,148

Sherminator,
#цепочки-промисов
Ответить с цитированием
  #3 (permalink)  
Старый 29.09.2016, 20:23
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

рони,
что-то я сразу не врубился, что нужен конечный результат.

Sherminator,
а разве это нельзя решить одним sql запросом?
Ответить с цитированием
  #4 (permalink)  
Старый 30.09.2016, 10:00
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от Sherminator
Запрос А = запрашиваем пользователя, получаем айди страны, региона, города
Запрос В = запрашиваем страну по айди, получаем айди областей
Запрос С = запрашиваем область по айди, получаем айди городов
Запрос D = запрашиваем город по айди, и получаем наконец название города...

Это ты придумал себе мазохизм. Из индекса можно получить все остальное за раз. Если у тебя реальное дерево, то применяй рекурсию или реально деревянные запросы. Если у тебя списки, то применяй обычный запрос с объединением заранее известных таблиц.
Ответить с цитированием
  #5 (permalink)  
Старый 30.09.2016, 10:03
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от Sherminator
не получается вернуть результат в родительскую ф-цию
Их нужно сохранять в контексте, но тебе этого не надо. Тебе надо DDL и DML сделать нормальными, а не подгонять под уродство другое уродство.
Ответить с цитированием
  #6 (permalink)  
Старый 30.09.2016, 11:27
Аспирант
Отправить личное сообщение для Sherminator Посмотреть профиль Найти все сообщения от Sherminator
 
Регистрация: 01.08.2012
Сообщений: 50

Сообщение от рони
#цепочки-промисов
То, что нужно)

Всем спасибо!
Ответить с цитированием
  #7 (permalink)  
Старый 30.09.2016, 11:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Sherminator
То, что нужно)
Вот это вряд ли, а если так, то структура вашей базы есть полный бардак.
Ответить с цитированием
  #8 (permalink)  
Старый 30.09.2016, 13:38
Аспирант
Отправить личное сообщение для Sherminator Посмотреть профиль Найти все сообщения от Sherminator
 
Регистрация: 01.08.2012
Сообщений: 50

Сообщение от laimas
Вот это вряд ли, а если так, то структура вашей базы есть полный бардак.
1. Был всего лишь приведен пример, когда нужно было сделать серию последовательных async запросов.
2. Я не сказал что это SQL или иная RDB. Такая БД, понятное дело убога, но если данные хранить в файлах-сущностях(txt, mdb, dat...), то такая структура будет менее ресурсозатратна.
3. Однако такой пример имеет место быть, если сервер возвращает объекты, а не конкретно результат запроса.

Последний раз редактировалось Sherminator, 30.09.2016 в 13:43.
Ответить с цитированием
  #9 (permalink)  
Старый 30.09.2016, 14:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Sherminator
Был всего лишь приведен пример
Значит пример был неудачный. Ведь не важно в чем хранить данные, просто если судить по примеру получит все можно одним запросом к серверу. А уж что возвращает сервер, это уже ваша задача определять данным необходимое представление.

Ну а то, что бывает необходимость в последовательных запросах, то никто спорить об этом не будет. )
Ответить с цитированием
  #10 (permalink)  
Старый 03.10.2016, 05:06
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от Sherminator
сли сервер возвращает объекты
Сданные в эксплуатацию надеюсь? Да кто-то разве против мазохизма? Мазохируй, видимо в этом смысл твоего бытия. Лол.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sencha touch Иногда не генерятся ajax запросы к серверу rclarion ExtJS 1 03.11.2014 18:37
Как поставить мои ajax запросы в очередь? Romingood AJAX и COMET 1 18.10.2013 23:38
ajax запросы на поддомены any.zicky AJAX и COMET 2 18.11.2012 20:19
Ajax запросы увеличиваются xurshid AJAX и COMET 4 17.05.2012 16:46
старые(выполненые) ajax запросы archcoffe jQuery 7 03.05.2012 11:50