Вход

Просмотр полной версии : Вложенные Ajax запросы


Sherminator
29.09.2016, 20:10
Всем доброго времени суток!

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

Например (хардкор конечно, но):

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) запросы, когда для одного запроса нужно сделать сначала другой, а для другого сначала третий и т.д ?

рони
29.09.2016, 20:17
Sherminator,
#цепочки-промисов (https://learn.javascript.ru/promise#цепочки-промисов)

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

Sherminator,
а разве это нельзя решить одним sql запросом?

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


Это ты придумал себе мазохизм. Из индекса можно получить все остальное за раз. Если у тебя реальное дерево, то применяй рекурсию или реально деревянные запросы. Если у тебя списки, то применяй обычный запрос с объединением заранее известных таблиц.

warren buffet
30.09.2016, 10:03
не получается вернуть результат в родительскую ф-цию

Их нужно сохранять в контексте, но тебе этого не надо. Тебе надо DDL и DML сделать нормальными, а не подгонять под уродство другое уродство.

Sherminator
30.09.2016, 11:27
#цепочки-промисов

То, что нужно)

Всем спасибо!

laimas
30.09.2016, 11:37
То, что нужно)

Вот это вряд ли, а если так, то структура вашей базы есть полный бардак.

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

laimas
30.09.2016, 14:05
Был всего лишь приведен пример

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

Ну а то, что бывает необходимость в последовательных запросах, то никто спорить об этом не будет. )

warren buffet
03.10.2016, 05:06
сли сервер возвращает объекты

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

warren buffet
03.10.2016, 05:11
Единственный случай вложенных запросов в моей практике возник при загрузке связанных файлов скриптов. Например загружается файл скрипа формы, в которой есть поле file и еще надо тогда загрузить скрипт для файловой части. Вот тогда приходится писать вроде


include.js('form',function(){include.js('form_file '},set_page);


Именно когда нужен определенный порядок, а применительно к SQL порядка не может быть вообще.